Verschieben von zwei bestimmten Dateien in den übergeordneten Ordner in mehreren Verzeichnissen mit eindeutigen Namen

2

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

Eine dieser Dateien ist generisch, aber die andere Datei ist 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 befinden sich über 2000 Ordner in Unterordnern von 200 bis 300 übergeordneten Ordnern, die die untergeordneten Ordner enthalten

Was ich bisher habe, dass in BASH das nicht funktioniert, ist:

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

Ich bin sehr neu in der Skripterstellung 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.

J.Mike
quelle

Antworten:

3

So verschieben Sie eine beliebige Datei mit dem Namen fileA.txt oder fileB.txt in das übergeordnete Verzeichnis:

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

Oder um eine beliebige Datei mit dem Namen zu verschieben fileA.txt oder fileB.bb in das übergeordnete Verzeichnis:

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

Wie es funktioniert

  • . erzählt find um mit dem aktuellen Verzeichnis zu beginnen. (Sie können dies durch ein beliebiges Verzeichnis ersetzen.

  • -maxdepth 4 erzählt find nicht mehr als vier Ebenen tief in die Verzeichnisstruktur abzusteigen.

  • -type f erzählt find nur nach regulären Dateien suchen.

  • -name 'file[AB].txt' erzählt find um nur nach Dateien zu suchen, die dem Glob entsprechen file[AB].txt.

    Alternativ auch passend fileA.txt oder fileB.bbverwenden wir zwei -name Tests kombiniert mit einem logischen oder ( -o ) und gruppiert mit parens:

    \( -name 'fileA.txt' -o -name 'fileB.bb' \)
    
  • -execdir mv {} ../ \; erzählt find Wechseln Sie in das Verzeichnis der Datei, und führen Sie den Shell-Befehl aus mv {} ../ woher find wird ersetzen {} mit dem tatsächlichen Namen der Datei. Der Ausdruck ../ ist Unix-speak für übergeordnetes Verzeichnis. Das Nachlaufen \; nur Noten für find das Ende des Shell-Befehls

John1024
quelle
Was für eine unglaublich gut erklärte Antwort! Ich habe eine alternative Problemumgehung gefunden, die nicht so allgemein funktioniert, aber ich werde ein paar Testordner einrichten und es erneut versuchen, damit ich daraus lernen kann. Ich danke dir sehr!
J.Mike
Wenn ich den untergeordneten Ordner nach dem Entfernen der Dateien entfernen möchte, füge ich einfach einen hinzu. -rm am Ende oder würde das das neue übergeordnete Verzeichnis entfernen?
J.Mike
1
@ J.Mike Während der Antwortende sich schriftlich bedankt und dies wahrscheinlich zu schätzen weiß, besteht eine hervorragende Möglichkeit, Dankbarkeit für die Hilfe einer Person zu zeigen, darin, ihre Antwort als die akzeptierte zu wählen (wenn Sie dies natürlich für verdient halten). Hier ist eine nützliche Anleitung dazu Was tun, wenn jemand Ihre Frage beantwortet? .
CJK