J'ai un tas de fichiers .zip dans plusieurs répertoires:
Fol1/Fol2
Fol3
Fol4/Fol5
Comment pourrais-je les déplacer tous vers un dossier de base commun?
J'ai un tas de fichiers .zip dans plusieurs répertoires:
Fol1/Fol2
Fol3
Fol4/Fol5
Comment pourrais-je les déplacer tous vers un dossier de base commun?
Réponses:
Allez dans le répertoire toplevel de l’arborescence contenant les fichiers zip ( cd …
), puis exécutez
mv **/*.zip /path/to/single/target/directory
Cela fonctionne hors de la boîte en zsh. Si votre shell est bash, vous devrez d' shopt -s globstar
abord l' exécuter (vous pouvez et devriez mettre cette commande dans votre ~/.bashrc
). Si votre shell est en ksh, vous devrez d' set -o globstar
abord l' exécuter (mettez-le dans votre ~/.kshrc
).
Alternativement, utilisez find
qui fonctionne partout sans préparation particulière mais qui est plus compliqué:
find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;
Si vous voulez ensuite supprimer les répertoires vides, en zsh:
rmdir **/*(/^Fod)
En bash ou en ksh:
rmdir **/*/
et répétez tant qu'il y a des répertoires vides à supprimer. Alternativement, dans n'importe quelle coquille
find . -depth -type d -empty -exec rmdir {} \;
find
commande ci-dessus a fonctionné sous bash, mais a dû être remplacée par find . -name
etc. pour que cela fonctionne.
.
est implicite pour la recherche GNU mais pas pour les autres, je l'ai ajouté explicitement.
Si vous utilisez bash version 4 ou supérieure ou zsh, vous pouvez également utiliser la méthode de redimensionnement récursif:
mv **/*.zip /path/to/move/zip/files/to
Cela déplacera SEULEMENT les fichiers et non leurs chemins relatifs, ainsi des collisions pourraient se produire.
Celui-ci est sûr lorsque vous déplacez des données et sans erreur qui supportait la plupart des distributions indépendamment des versions. Cette commande va scanner les sous-répertoires puis les déplacer ou les copier dans votre nouveau répertoire de destination.
find . -name *.flac -exec mv '{}' "./flac/" ";"
*.flac
quelque chose comme *.zip
dans votre cas. Ou *.doc
tout simplement une extension fonctionne.mv
est la commande pour déplacer des fichiers, ou vous pouvez utiliser cp
pour copier des données au lieu de déplacer../flac/
est le répertoire de destination vers lequel je veux déplacer tous les fichiers FLAC. Vous pouvez également lui donner un chemin complet comme/home/myid/flac/
Exemple complet. (Dans ce cas, il y a beaucoup de sous-répertoires avec le nom d'artiste de musique à /home/myid/Music/
et les fichiers FLAC sont répartis sur différents niveaux de sous-répertoires. Comme je n'ai pas besoin de dossiers d'artistes, je veux que tous les fichiers FLAC soient dans un répertoire à/home/myid/Music/flac/
cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls
Ensuite, tous les fichiers FLAC seront affichés.
;
faire?
En tant que bash hack, vous pouvez utiliser le pouvoir de 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/
Cela présente l'avantage de ne pas dépendre des extensions de fichier, car elle utilise la file
commande pour choisir les fichiers à déplacer et préserve la structure des répertoires, mais elle ne fonctionne pas avec les chemins contenant des espaces.
La finale rm
est juste là pour supprimer les fichiers originaux (car @ InquilineKea a dit qu'il ne se souciait pas du dossier original dans le commentaire).
Bien entendu, cela convient particulièrement si les dossiers origin / et target / se trouvent sur des disques différents. Sinon, les autres solutions proposées sont plus efficaces (même si elles reposent sur des conventions de dénomination plutôt que sur file
le contenu).
En supposant que vous ayez les versions GNU de find et mv, les solutions suivantes seront plus efficaces que les réponses existantes basées sur find:
find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
L'utilisation de a +
à la fin de find -exec signifie qu'une liste de fichiers sera transmise à la commande mv, au lieu d'exécuter une commande mv par fichier trouvé. Cependant, une limitation de ceci est que vous ne pouvez placer que le '{}' à la fin de la commande, ce qui nécessite l'utilisation de l'option mv --target-directory et, autant que je sache, il s'agit d'un GNU-ism.