Verschieben von zwei bestimmten Dateien in den übergeordneten Ordner innerhalb mehrerer Verzeichnisse mit eindeutigen Namen

Verschieben von zwei bestimmten Dateien in den übergeordneten Ordner innerhalb mehrerer Verzeichnisse mit eindeutigen Namen

Ich muss zwei bestimmte Dateien, wir nennen sie fileA.txt und fileB.sh, in den übergeordneten Ordner verschieben.

Eine dieser Dateien ist allgemein, die andere Datei ist jedoch spezifisch für den übergeordneten Ordner und kann nicht in alle Ordner kopiert werden.

Die Ordnerhierarchie sieht folgendermaßen aus:Ordnerhierarchie

Der übergeordnete Ordner ist eindeutig und muss gleich bleiben. Insgesamt gibt es über 2000 Ordner in Unterordnern von 200-300 übergeordneten Ordnern, die die untergeordneten Ordner enthalten.

Was bei mir bisher in BASH nicht funktioniert, ist:

find -maxdepth 4 -type f -name ‘*.bb’ ‘*.txt’; mv ../.

Ich bin SEHR neu im Scripting und weiß, dass dies eine sehr einfache Aufgabe ist. Ich entschuldige mich für die schreckliche Zeichnung, aber ich habe meinen Kopf zu lange gegen die Wand geschlagen.

Antwort1

So verschieben Sie eine beliebige benannte Datei fileA.txtin fileB.txtdas unmittelbar übergeordnete Verzeichnis:

find . -maxdepth 4 -type f -name 'file[AB].txt' -execdir mv {} ../ \;

Oder verschieben Sie eine beliebige Datei mit dem Namen fileA.txtoder fileB.bbin das unmittelbar übergeordnete Verzeichnis:

find . -maxdepth 4 -type f \( -name 'fileA.txt' -o -name 'fileB.bb' \) -execdir mv {} ../ \;

Wie es funktioniert

  • .weist darauf hin find, mit dem aktuellen Verzeichnis zu beginnen. (Sie können dies durch jedes beliebige Verzeichnis ersetzen.)

  • -maxdepth 4weist darauf hin find, nicht tiefer als vier Ebenen in die Verzeichnisstruktur einzutauchen.

  • -type f weist darauf hin find, dass nur nach regulären Dateien gesucht werden soll.

  • -name 'file[AB].txt'weist an find, nur nach Dateien zu suchen, die mit dem Glob übereinstimmen file[AB].txt.

    Alternativ verwenden wir zum Zuordnen von entweder fileA.txtoder zwei Tests, die mit einem logischen Oder ( ) kombiniert und mit Klammern gruppiert sind:fileB.bb-name-o

    \( -name 'fileA.txt' -o -name 'fileB.bb' \)
    
  • -execdir mv {} ../ \;weist an find, mit chdir in das Verzeichnis der Datei zu wechseln und den Shell-Befehl auszuführen, mv {} ../wobei durch den tatsächlichen Namen der Datei findersetzt wird . Der Ausdruck ist Unix-Sprache für übergeordnetes Verzeichnis. Der nachfolgende Text markiert lediglich das Ende des Shell-Befehls{}../\;find

verwandte Informationen