versuchte es mit Ubuntu zsh 5.0.2:
for pdir in */ do cd $pdir for dir in */ do cd $dir mv */*.zip . cd .. done cd .. done
Wie finde ich alle Dateien eines bestimmten Typs / Namens und kopiere sie -n Ebenen nach oben ? Hier ist die Dateisystem-Baumstruktur:
germany/ | adventure/ | 300x600/ | | | file1.jpg | file2.zip | 400x600/ | file8.jpg file4.zip switzerland/ | adventure/...
Es gibt viele Länderordner, etwa 20, und die ZIP-Dateien sind nicht unbedingt 3 Ebenen tief. Ich befinde mich zurzeit in ihrem übergeordneten Ordner countries/
und möchte alle ZIP- Dateien auf einer Ebene in das adventure/
Verzeichnis des entsprechenden Landes / Ordners finden und kopieren .
Ich habe es versucht:
find . -type f -name '*.zip' -exec mv {}/.. \;
aber dieser versagte kläglich. Es wurde jede Datei um eine Ebene nach oben verschoben, dann wurden diese erneut um eine Ebene nach oben verschoben.
Vielen Dank!
EDIT: Ich habe ein bisschen mit Lösungen aus den Antworten gespielt und viele man
Seiten gelesen :). Schließlich akzeptierte ich die Lösung, die mir am besten gefallen hat, da sie elegant und unabhängig von der Schale ist.
Ich versuche immer noch herauszufinden:
find
als Schleife oder werden geschweifte Klammern in anderen Programmiersprachen als "Liste / Array" behandelt? Das bedeutet: Wird es mit den gefundenen Ergebnissen (dh Zeichenfolgen) auf einmal gefüllt und DANN an den Befehl weitergegeben -exec
?mv/cp
, ob -n-Ebenen [auf / ab] gehen sollen?versuchte es mit Ubuntu zsh 5.0.2:
for pdir in */ do cd $pdir for dir in */ do cd $dir mv */*.zip . cd .. done cd .. done
Sie können es shell-unabhängig machen und es zu einem find
Befehl zusammenfassen:
find . -type f -name '*.zip' -exec \ sh -c 'echo cp -- "$0" "$(dirname "$0")"/..' {} \;
Entfernen Sie das, echo
wenn Sie sicher sind, dass es das tut, was Sie möchten.
Verwenden Sie find
diese Option, um die Dateien zu suchen. Führen Sie eine Shell mit aus -exec sh -c
, und übergeben Sie die gefundene Datei mit {}
dem ersten Argument an diese Shell. Der Shell steht daher der Dateipfad als zur Verfügung $0
.
Sie können dann dirname "$0"
und einen Befehl substitution ( $(…)
) verwenden, um das übergeordnete Verzeichnis der Datei abzurufen. Hängen Sie so viele an, /..
wie Sie höher reisen möchten.
Beachten Sie, dass ich zitierte die Dateinamen von Dateien mit Zeilenumbrüche oder Leerzeichen im Namen zu verhindern, nicht ordnungsgemäß erweitert aus ist.
Nur die schnelle Alternative, wenn die Realität so einfach ist wie das gegebene Beispiel:
cd germany mv */*/*.zip .
(und es gibt keine Millionen von Dateien)