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

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

J'ai une structure de dossiers extrêmement moche, avec certains fichiers .mp3 enterrés 6 niveaux de profondeur dans un sous-dossier.

Je veux finir avec tous les fichiers (principalement .mp3 mais pas tous) dans un seul répertoire, sans aucun sous-répertoire, en utilisant Ubuntu.

Aidez-moi?

Il y a une excellente réponse dans le askubuntu-QA .

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

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

Il déplacera tous les fichiers et dossiers du dossier Téléchargements vers le dossier Vidéos.


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

Mais, si vous souhaitez déplacer tous les fichiers (mais pas les dossiers) du dossier Téléchargements vers le dossier Vidéos, 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 des sous-dossiers:

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

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

Ici, l'option -maxdepth spécifie la façon dont la recherche profonde devrait essayer, 1 signifie uniquement le répertoire spécifié dans la commande find. Vous pouvez également essayer d'utiliser 2 , 3 pour tester.

Consultez la page de manuel Ubuntu find pour une explication détaillée.

La source

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 /dst/dir en utilisant la commande mv . Remplacez simplement les annuaires par le vôtre. Les fichiers avec les mêmes noms seront renommés automatiquement.

Sélection des fichiers à déplacer

Si vous souhaitez déplacer uniquement des fichiers MP3, ajoutez -iname "*.mp3" option à la commande find after -type f .

Comparaison avec la réponse de c0dev

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

  1. Sauf mv la solution avec -exec + n'a pas besoin d'appeler une commande supplémentaire comme xargs ou parallel et remettre les noms de fichiers deux fois.
  2. L'autre réponse remplacera 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 suffixe comme ~3~ seront cachées dans la plupart des fichiers par défaut. Malheureusement, mv ne permet pas de modifier le suffixe, mais il peut être facilement post-traité par des commandes supplémentaires. Il s'agit d'une extension GNU.
  3. Contrairement à la -exec command {} + -print0 -exec command {} + fait partie des normes IEEE Std 1003.1 (POSIX), ISO / IEC 9945 et Single UNIX. Ainsi, il devrait être plus portable. Voir IEEE Std 1003.1, édition 2004 , IEEE Std 1003.1, Edition 2013 et 0000243: Ajoutez -print0 à "trouver" . Mais de toute façon, le changement de mv requis de mv est une extension GNU, de sorte que la commande entière n'est pas portable entre les systèmes POSIX.

Remarque: dans le cas, la find pourrait générer des chemins commençant par - (je ne connais pas une telle implémentation de find pour le moment.) Le {} devrait être précédé de l'indicateur de fin de page: -- .

Malheureusement, je n'ai pas une réputation suffisamment élevée pour commenter la solution marquée. Cependant, je voulais avertir les autres sur un problème que j'ai rencontré. C'est assez amateur; Cependant, lorsque vous faites plusieurs choses, cela ne vous rappelle pas tout d'abord. J'espère que cela aidera les autres.

Problème

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

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

Cause

Le /src est un parent du /dst (ex: /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 my /src , puis redémarrez la commande pour les placer dans le répertoire /src/../dst dans /src/../dst je voulais finir.