58 votes

Comment déplacer des fichiers de sous-répertoires imbriqués dans un autre dossier sous ubuntu ? (J'essaie de supprimer de nombreux sous-dossiers)

Comment puis-je déplacer fichiers et non des répertoires dans un autre dossier/répertoire parent ?

J'ai une structure de dossier extrêmement moche, avec des fichiers .mp3 enfouis à 6 niveaux de profondeur dans un sous-dossier.

Je veux que tous les fichiers (principalement des .mp3, mais pas tous) se retrouvent dans un seul répertoire, sans aucun sous-répertoire, sous Ubuntu.

Aide ?

68voto

Christian Points 6908

Il y a une grande réponse dans l'askubuntu-QA .

Pour ce faire, ouvrez un terminal et exécutez cette commande :

mv  -v ~/Downloads/* ~/Videos/

Il va déplacer tous les fichiers et dossiers de Dow dans le dossier Vidéos.


Pour déplacer tous les fichiers, mais pas les dossiers :

Mais, si vous souhaitez déplacer tous les fichiers ( dossier Downloads vers le dossier Videos, utilisez cette commande

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

Pour déplacer uniquement les fichiers des dossiers de téléchargement, mais pas ceux des sous-dossiers :

Si vous voulez déplacer tous les fichiers du dossier Téléchargements, mais pas ceux du dossier fichiers contenus dans les dossiers du dossier Téléchargements, utilisez cette commande :

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

ici, -maxdepth L'option spécifie la profondeur à laquelle fi 1 signifie, seulement le répertoire spécifié dans la commande find. Vous pouvez essayer d'utiliser 2 , 3 également à tester.

Voir le site Ubuntu trouver la page de manuel pour une explication détaillée.

Source :

19voto

Solution

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

La commande trouvera tous les fichiers réguliers sous /src/dir (y compris tous les sous-répertoires) et les déplacer vers le répertoire /dst/dir en utilisant la commande mv . Remplacez simplement les répertoires par les vôtres. Les fichiers ayant le même nom seront renommés automatiquement.

Sélection des fichiers à déplacer

Si vous souhaitez déplacer uniquement les fichiers MP3, ajoutez -iname "*.mp3" à l'option find après la commande -type f .

Comparaison avec la réponse de c0dev

Seule la deuxième commande de la réponse de c0dev répond à la question. Voici comment elle se compare à cette réponse. Les points 3. et 4. peuvent être résolus dans l'autre réponse de la même manière qu'ici.

  1. Sauf mv la solution avec -exec + n'a pas besoin d'appeler une commande supplémentaire comme xargs o parallel et remettez deux fois les noms de fichiers.
  2. L'autre réponse écrasera silencieusement les fichiers qui ont le même nom. Ici, les fichiers seront automatiquement renommés grâce à l'option --backup=numbered . Malheureusement, ces sauvegardes avec un suffixe comme ~3~ sera caché par défaut dans la plupart des gestionnaires de fichiers. Malheureusement, mv ne permet pas de modifier le suffixe mais il pourrait être facilement post-traité par des commandes supplémentaires. Il s'agit d'une extension GNU.
  3. Contrairement à -print0 -exec command {} + fait partie des normes IEEE Std 1003.1 (POSIX), ISO/IEC 9945 et The Single UNIX Specification. Il devrait donc être plus portable. Voir IEEE Std 1003.1, édition 2004 , IEEE Std 1003.1, édition 2013 y 0000243 : Ajouter -print0 à "find . Mais quoi qu'il en soit, l'exigence -t de mv est une extension GNU, donc la commande entière n'est pas portable entre les systèmes POSIX.

Note : Dans le cas où find serait capable de produire des chemins commençant par - (Je n'ai pas connaissance d'une telle mise en œuvre de l'option find pour le moment.) le {} doit être précédé de l'indicateur de fin d'option : -- .

8voto

lion Points 81

Ouvrez le terminal, allez dans votre dossier de dossiers avec des fichiers et exécutez find . -mindepth 2 -type f -print -exec mv {} . \; pour déplacer tous les fichiers de ces sous-répertoires dans le répertoire courant.

3voto

MackAltman Points 31

Malheureusement, je n'ai pas une réputation assez élevée pour commenter la solution marquée. Cependant, je voulais mettre en garde les autres sur un problème que j'ai rencontré. Il s'agit d'un problème d'amateur ; cependant, lorsque vous faites plusieurs choses, il peut ne pas vous venir à l'esprit au premier abord. J'espère que cela aidera d'autres personnes.

Problème

Des variantes du message suivant ont été fournies après le lancement de la commande. La commande crée ensuite plusieurs fichiers.

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

Cause

En /src est un parent de la /dst (par exemple /src/../dst/ ).

Solution

Bien qu'il puisse y avoir une meilleure solution, j'ai simplement déplacé les fichiers dans un répertoire temporaire en dehors de mon espace de travail. /src puis réexécute la commande pour les replacer dans le cadre de la /src/../dst le répertoire dans lequel je voulais qu'ils se retrouvent.

2voto

X-File Points 41

Mon seul mot - cela fonctionne sur les Macs mais devrait aussi fonctionner sur n'importe quel *nix. Commencez par le répertoire où vous voulez supprimer les sous-dossiers.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

La première partie déplace tout ce qui se trouve dans tous les sous-dossiers vers le dossier d'où vous lancez la commande ; la seconde partie vérifie si les sous-répertoires sont vides (ils devraient l'être maintenant :-) et les supprime afin que vous obteniez tout ici sans sous-répertoire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X