Ich habe eine Reihe von .zip-Dateien in mehreren Verzeichnissen:
Fol1/Fol2
Fol3
Fol4/Fol5
Wie würde ich sie alle in einen gemeinsamen Basisordner verschieben?
command-line
files
find
recursive
InquilineKea
quelle
quelle
Antworten:
Wechseln Sie in das oberste Verzeichnis des Baums, der die ZIP-Dateien enthält (
cd …
), und führen Sie es ausDies funktioniert in zsh sofort. Wenn Ihre Shell bash ist, müssen Sie
shopt -s globstar
zuerst ausführen (Sie können und sollten diesen Befehl in Ihre einfügen~/.bashrc
). Wenn Ihre Shell ksh ist, müssen Sieset -o globstar
zuerst ausführen (in Ihre einfügen~/.kshrc
).Alternativ kann verwendet werden
find
, was überall ohne besondere Vorbereitung funktioniert, aber komplizierter ist:Wenn Sie anschließend leere Verzeichnisse entfernen möchten, gehen Sie in zsh wie folgt vor:
In bash oder ksh:
und wiederholen, solange leere Verzeichnisse entfernt werden müssen. Alternativ in einer beliebigen Schale
quelle
find
obige Befehl funktionierte in bash, musste aber zufind . -name
etc wechseln , damit es funktioniert..
ist implizit für GNU find, aber nicht für andere, ich habe es explizit hinzugefügt.Wenn Sie nur die
.zip
Dateien verschieben möchten, können Sie so etwas tunquelle
Wenn Sie bash Version 4 oder höher oder zsh verwenden , können Sie auch rekursives Globbing verwenden:
Dadurch werden NUR die Dateien und nicht ihre relativen Pfade verschoben, sodass möglicherweise Kollisionen auftreten.
quelle
Dieser ist sicher beim Verschieben von Daten und fehlerfrei, was vor allem Distribution unabhängig von Versionen unterstützt. Dieser Befehl durchsucht Unterverzeichnisse und verschiebt oder kopiert sie in Ihr neues Zielverzeichnis.
*.flac
in etwas wie*.zip
in Ihrem Fall ändern . Oder*.doc
einfach jede Erweiterung funktioniert.mv
ist der Befehl zum Verschieben von Dateien, oder Sie könnencp
Daten kopieren, anstatt sie zu verschieben../flac/
ist das Zielverzeichnis, in das ich alle FLAC-Dateien verschieben möchte. Sie können ihm auch einen vollständigen Pfad geben/home/myid/flac/
Vollständiges Beispiel. (In diesem Fall gibt es viele Unterverzeichnisse mit dem Namen des Musikkünstlers unter
/home/myid/Music/
und dann sind die FLAC-Dateien über alle Unterverzeichnisse verteilt. Da ich keine Künstlerordner benötige, sondern alle FLAC-Dateien in einem Verzeichnis unter haben möchte/home/myid/Music/flac/
Dann werden alle FLAC-Dateien angezeigt.
quelle
;
tun?Als Bash-Hack können Sie die folgenden Möglichkeiten nutzen
tar
:Dies hat den Vorteil, dass es nicht von Dateierweiterungen abhängt, da es den
file
Befehl zum Auswählen der zu verschiebenden Dateien verwendet und die Verzeichnisstruktur beibehält, aber nicht mit Pfaden arbeitet, die Leerzeichen enthalten.Das Finale
rm
dient nur zum Entfernen der Originaldateien (da @InquilineKea mitteilt, dass ihm der Originalordner im Kommentar egal ist).Dies ist natürlich besonders geeignet, wenn sich der Ursprungs- / und der Zielordner / auf unterschiedlichen Datenträgern befinden. Andernfalls sind die anderen vorgeschlagenen Lösungen effizienter (auch wenn sie auf Namenskonventionen anstatt auf deren
file
Inhalten beruhen ).quelle
Vorausgesetzt, Sie haben die GNU-Versionen von find und mv, ist Folgendes effizienter als die vorhandenen findbasierten Antworten:
Die Verwendung von a
+
am Ende des Befehls find -exec bedeutet, dass eine Liste von Dateien an den Befehl mv übergeben wird, anstatt einen Befehl mv pro gefundener Datei auszuführen. Eine Einschränkung ist jedoch, dass Sie nur das '{}' am Ende des Befehls einfügen können, was die Verwendung der Option mv --target-directory erforderlich macht, und soweit ich weiß, handelt es sich um einen GNU-Ismus.quelle