Ho un sacco di file .zip in diverse directory:
Fol1/Fol2
Fol3
Fol4/Fol5
Come potrei spostarli tutti in una cartella base comune?
Ho un sacco di file .zip in diverse directory:
Fol1/Fol2
Fol3
Fol4/Fol5
Come potrei spostarli tutti in una cartella base comune?
Risposte:
Vai alla directory di livello superiore dell'albero contenente i file zip ( cd …
), quindi esegui
mv **/*.zip /path/to/single/target/directory
Questo funziona fuori dagli schemi in zsh. Se la tua shell è bash, dovrai shopt -s globstar
prima eseguire (puoi e dovresti inserire questo comando nel tuo ~/.bashrc
). Se la tua shell è ksh, dovrai set -o globstar
prima eseguirla (mettila nella tua ~/.kshrc
).
In alternativa, utilizzare find
, che funziona ovunque senza una preparazione speciale ma è più complicato:
find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;
Se si desidera rimuovere in seguito directory vuote, in zsh:
rmdir **/*(/^Fod)
In bash o ksh:
rmdir **/*/
e ripetere finché ci sono directory vuote da rimuovere. In alternativa, in qualsiasi shell
find . -depth -type d -empty -exec rmdir {} \;
find
comando sopra ha funzionato in bash, ma ha dovuto cambiare in find . -name
etc per farlo funzionare.
.
è implicito per GNU find ma non per altri, l'ho aggiunto esplicitamente.
Se stai usando bash versione 4 o successiva o zsh puoi anche usare globbing ricorsivo:
mv **/*.zip /path/to/move/zip/files/to
Questo sposterà SOLO i file e non i relativi percorsi, quindi potrebbero verificarsi collisioni.
Questo è sicuro quando si spostano dati ed è privo di errori che supportava soprattutto la distribuzione indipendentemente dalle versioni. Questo comando esegue la scansione delle sottodirectory e quindi si sposta o copia nella nuova directory di destinazione.
find . -name *.flac -exec mv '{}' "./flac/" ";"
*.flac
qualcosa come *.zip
nel tuo caso. O *.doc
qualsiasi estensione funziona.mv
è il comando per spostare i file, oppure è possibile utilizzare cp
per copiare i dati invece di spostarli../flac/
è la directory di destinazione in cui voglio spostare tutti i file FLAC. Puoi anche dargli un percorso completo come/home/myid/flac/
Esempio completo (in questo caso, ci sono molte sottodirectory con il nome dell'artista musicale a /home/myid/Music/
e quindi i file FLAC sono tutti su livelli di sottodirectory diversi. Dato che non ho bisogno di cartelle per artisti ma voglio avere tutti i file FLAC in una directory in/home/myid/Music/flac/
cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls
Quindi visualizzerà tutti i file FLAC.
;
fare?
Come hack bash, puoi usare il potere di tar
:
(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/
Ciò ha il vantaggio di non dipendere dalle estensioni dei file, poiché utilizza il file
comando per scegliere i file da spostare e preserva la struttura della directory, ma non funziona con percorsi contenenti spazi.
Il finale rm
è lì solo per rimuovere i file originali (perché @InquilineKea ha detto che non gli importa della cartella originale nel commento).
Naturalmente questo è particolarmente adatto se le cartelle origin / e target / si trovano su dischi diversi. Altrimenti le altre soluzioni proposte sono più efficienti (anche se si basano su convenzioni di denominazione, anziché sul file
contenuto).
Supponendo che tu abbia le versioni GNU di find e mv, le seguenti saranno più efficienti delle risposte basate su find esistenti:
find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
L'uso di +
a alla fine di find -exec significa che un elenco di file verrà passato al comando mv, anziché eseguire un comando mv per file trovato. Tuttavia, una limitazione di ciò è che puoi solo posizionare '{}' alla fine del comando, il che richiede l'uso dell'opzione mv --target-directory, e per quanto ne so che è un GNU-ism.