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

421
J.Mike

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

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

Die Ordnerhierarchie sieht folgendermaßen aus: Ordnerhierarchie

Der übergeordnete Ordner ist eindeutig und muss gleich bleiben. Es befinden sich insgesamt über 2000 Ordner in Unterordnern von 200-300 übergeordneten Ordnern, die die untergeordneten Ordner enthalten

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

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

Ich bin SEHR Neulich im Scripting und ich 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.

2

1 Antwort auf die Frage

3
John1024

So verschieben Sie eine Datei mit dem Namen fileA.txtoder fileB.txtin das unmittelbare übergeordnete Verzeichnis:

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

Oder verschieben Sie eine Datei mit dem Namen fileA.txtoder fileB.bbin ihr unmittelbares übergeordnetes Verzeichnis:

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

Wie es funktioniert

  • .Startet findmit dem aktuellen Verzeichnis. (Sie können dies durch ein beliebiges Verzeichnis ersetzen, das Sie möchten.

  • -maxdepth 4weist an, findnicht mehr als vier Ebenen tief in die Verzeichnisstruktur einzusteigen.

  • -type f Sagt find, nur nach regulären Dateien zu suchen.

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

    Alternativ verwenden wir zwei fileA.txtoder fileB.bbzwei -nameTests, die mit einem logischen -o-oder ( ) kombiniert und mit Parens gruppiert werden:

    \( -name 'fileA.txt' -o -name 'fileB.bb' \) 
  • -execdir mv {} ../ \;sagt findzu dem Datei - Verzeichnis chdir und den Shell - Befehl ausführen, mv {} ../wo findersetzen wird {}mit der Datei tatsächlichen Namen. Der Ausdruck ../ist Unix-Speak für das übergeordnete Verzeichnis. Das nachfolgende \;Zeichen markiert lediglich finddas Ende des Shell-Befehls

Was für eine unglaublich gut erklärte Antwort! Ich habe einen alternativen Workaround gefunden, der nicht so allgemein funktioniert, aber ich werde ein paar Testordner einrichten und dies erneut versuchen, damit ich davon lernen kann. Ich danke dir sehr! J.Mike vor 6 Jahren 0
Wenn ich den untergeordneten Ordner nach dem Entfernen der Dateien entfernen wollte, füge ich einfach ein; -rm am Ende oder würde das neue übergeordnete Verzeichnis entfernen? J.Mike vor 6 Jahren 0
@ J. Mike Während geschriebener Dank schön ist und wahrscheinlich vom Antwortenden geschätzt wird, ist es eine ausgezeichnete Möglichkeit, Dankbarkeit für die Hilfe einer Person zu zeigen, indem sie ihre Antwort als akzeptierte auswählen (wenn Sie dies natürlich verdient haben). Hier finden Sie eine nützliche Anleitung zum Thema [Was tun, wenn jemand Ihre Frage beantwortet] (https://superuser.com/help/someone-answers). CJK vor 6 Jahren 1