
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.txt
in fileB.txt
das unmittelbar übergeordnete Verzeichnis:
find . -maxdepth 4 -type f -name 'file[AB].txt' -execdir mv {} ../ \;
Oder verschieben Sie eine beliebige Datei mit dem Namen fileA.txt
oder fileB.bb
in das unmittelbar übergeordnete Verzeichnis:
find . -maxdepth 4 -type f \( -name 'fileA.txt' -o -name 'fileB.bb' \) -execdir mv {} ../ \;
Wie es funktioniert
.
weist darauf hinfind
, mit dem aktuellen Verzeichnis zu beginnen. (Sie können dies durch jedes beliebige Verzeichnis ersetzen.)-maxdepth 4
weist darauf hinfind
, nicht tiefer als vier Ebenen in die Verzeichnisstruktur einzutauchen.-type f
weist darauf hinfind
, dass nur nach regulären Dateien gesucht werden soll.-name 'file[AB].txt'
weist anfind
, nur nach Dateien zu suchen, die mit dem Glob übereinstimmenfile[AB].txt
.Alternativ verwenden wir zum Zuordnen von entweder
fileA.txt
oder 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 anfind
, mit chdir in das Verzeichnis der Datei zu wechseln und den Shell-Befehl auszuführen,mv {} ../
wobei durch den tatsächlichen Namen der Dateifind
ersetzt wird . Der Ausdruck ist Unix-Sprache für übergeordnetes Verzeichnis. Der nachfolgende Text markiert lediglich das Ende des Shell-Befehls{}
../
\;
find