• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]Bestimmte Dateien aus Unterverzeichnisse verschieben

Guten Tag,
Ich habe folgendes Problem:
Ich habe ein Verzeichnis mit Unterverzeichnisse die auch wieder Unterverzeichnisse haben könnten. Immer im letzten Unterverzeichnis sind Text-Dateien hinterlegt.
Nun möchte ich aus alle Verzeichnisse die nur 1-3 txt Dateien enthalten in einem Ordner verschieben. Ich hoffe das ist soweit klar. Was ich bisher gefunden habe ist:

Code:
find dir -name "*.txt" -print | wc -l

Aber dies zeigt mir nur die Anzahl der Dateien aller Unteordnerzussammen an.
Für Hilde wäre ich sehr dankbar.
 
A

Anonymous

Gast
bumbuminc schrieb:
Code:
find dir -name "*.txt" -print | wc -l

Aber dies zeigt mir nur die Anzahl der Dateien aller Unteordnerzussammen an.
Na da hast du ja schon eine ganze Menge. Wie dir nun wirklich ganz genau geholfen werden kann, wird leider nicht ganz klar, dazu sind deine Informationen zu wage. aber folgendes.

Code:
find dir -name "*.txt" -ls
Damit siehst du die Dateien mit samt Größe Rechten und dem Path wo sie liegen. Hier musst du dafür sorgen das die richtigen Dateien gefunden werden, und nur diese. Dazu müsstest du eventuell noch mit den Optionen von find etwas genauer einstellen. Erst wenn hier die Dateien angezeigt werden die du behandeln willst, dann erst andere Befehle anhängen. sonst droht im schlimmsten Fall beim Verschieben Datenverlust.

Code:
find dir -name "*.txt" -exec mv {} /NEUES/VERZEICHNISS \;
würde dir das verschieben, allerdings wenn dort irgendwelche Dateinamen doppelt vorkommen sollten sind hinerher einige Dateien wohl nicht mehr auffindbar, da sich doppelte Dateinamen überschreiben.
besser hier mit der OPtion "-i" von mv arbeiten, damit kannst du interaktiv verhindern das Dateien überschrieben werden wenn doppelte Dateinamen auftauchen. also
Code:
find dir -name "*.txt" -exec mv -i {} /NEUES/VERZEICHNISS \;

Um bei jeder einzelnen Datei die verschoben werden soll da interaktiv ein OK einzugeben geht folgendes
Code:
find dir -name "*.txt" -ok mv -i {} /NEUES/VERZEICHNISS \;

sollten es extrem viele Dateien sein die verschoben werden müssten, kann man sich überlegen mit xargs zu arbeiten, das geht dann ein ganzes Stück schneller. Allerdings müssen dann hier Dateien wenn bestimmte Sonderzeichen (auch Leezeichen) in den Dateinamen enthalten sein könnten, besonders behandelt werden. Du siehst also schon hier an diesen kleinen Beispielen, wir können dir mit den paar Informationen die uns bisher gegeben hast nur Tips geben, den entgültigen Befehl musst du zusammenstellen. Hilfe findest du auch in der Manpage von find.

robi
 
N'abend,

falls Du z.B. den neuen Ordner /data genannt hast
gehe in das obere "txt" Verzeichnis und gebe folgenden Befehl ein:

Code:
find -iname "*.txt" -type f -exec cp '{}' /data \;

Anschliessend kannst Du den alten Baum löschen.
 
bumbuminc schrieb:
Nun möchte ich aus alle Verzeichnisse die nur 1-3 txt Dateien enthalten in einem Ordner verschieben.
Gehören die 1-3 txt-Dateien zur Aufgabenstellung mit dazu?

Wenn ich richtig verstanden habe, willst Du die txt-Dateien nicht verschieben, wenn 4 oder mehr txt-Dateien in dem Verzeichnis liegen.
Oder habe ich da was falsch verstanden...?
 
ich bin einfach mal davon ausgegangen, dass Du die Dateien nur verschieben möchtest, wenn 1-3 txt-Dateien im Verzeichnis liegen.....

Probiere mal das folgende Script aus, ob dies Deinen Vorstellungen entspricht.
(den mv-Befehl bitte erst einsetzen, wenn Du alles gute getestet hast - mv mit -i verwenden...)
Code:
#!/bin/bash

DIRLIST=`find . -name "*.txt" -exec dirname {} \; | sort -u`

for AKT_DIR in $DIRLIST; do
        echo
        echo "Prüfe aktuell Verzeichnis $AKT_DIR"
        ANZAHL_FILES=`ls -1 $AKT_DIR/*.txt | wc -l`

        case $ANZAHL_FILES in
                1|2|3)  echo "Diese Dateien werden verschoben."
                        ls -l $AKT_DIR/*.txt
                        #hier Deinen mv-Befehl eintragen.
                        ;;

                4)      echo "nur knapp daneben - aber ich darf die Dateien trotzdem nicht verschieben."
                        ;;

                *)      echo "nichts zu tun"
                        ;;
        esac
done
 
Vielen Dank HBtux das ist genau das was ich gesucht habe, mit meinen stümperhaften Programmierkentnissen bin ich nicht wirklich weit gekommen.
 
Oben