web-dev-qa-db-fra.com

Comment puis-je déplacer des fichiers de sous-répertoires imbriqués vers un autre dossier d'ubuntu? (Essayer d'éliminer plusieurs sous-dossiers)

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

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

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

Aidez-moi?

34
Chris

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 les fichiers contenus dans les dossiers du dossier de 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 profondeur de la recherche, 1 signifie que seul le répertoire spécifié dans la commande find. Vous pouvez également utiliser 2, 3 pour tester.

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

La source

44
Christian Wörz

Solution

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

La commande trouvera tous les fichiers ordinaires sous /src/dir (y compris tous les sous-répertoires) et les déplacera vers le /dst/dir à l’aide de la commande mv. Il suffit de remplacer les répertoires par les vôtres. Les fichiers portant le même nom seront renommés automatiquement.

Sélection des fichiers à déplacer

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

Comparaison avec la réponse de c0dev

Seule la deuxième commande de la réponse de c0dev répond à la question. Vous trouverez ci-dessous une comparaison avec 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 que mv, la solution avec -exec + n'a pas besoin d'appeler une commande supplémentaire telle que xargs ou parallel et de remettre les noms de fichiers deux fois.
  2. L'autre réponse écrasera silencieusement les fichiers portant 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~ seront masquées dans la plupart des fichiers gérés par défaut. Malheureusement, mv ne permet pas de changer le suffixe, mais il pourrait facilement être post-traité par des commandes supplémentaires. C'est une extension GNU.
  3. Contrairement à -print0, -exec command {} + fait partie des normes IEEE Standard 1003.1 (POSIX), ISO/IEC 9945 et The Single UNIX Specification. Ainsi, il devrait être plus portable. Voir Norme IEEE 1003.1, édition 2004 , Norme IEEE standard 1003.1, 2013 et 0000243: Ajouter -print0 à "find" . Quoi qu'il en soit, le commutateur -t 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 où find serait capable de 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é du code de fin d’option: --.

12
pabouk

Malheureusement, je n'ai pas assez de réputation pour commenter cette solution. Cependant, je voulais mettre les autres en garde contre un problème que j'ai rencontré. C'est assez amateur; Cependant, lorsque vous faites plusieurs choses, cela ne vous vient peut-être pas à l’esprit. Espérons que cela aidera les autres.

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

Le /src est un parent du /dst (par exemple, /src/../dst/).

Solution

Bien qu'il y ait peut-être une meilleure solution, j'ai simplement déplacé les fichiers dans un répertoire temporaire en dehors de mon /src, puis j'ai réexécuté la commande pour les replacer dans le répertoire /src/../dst dans lequel je voulais qu'ils se retrouvent.

2
MackAltman

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

1
lion

Mon one-liner - cela fonctionne sur les Mac, mais devrait également le faire sur n'importe quel * nix. Commencez à partir du répertoire parent.

# 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 de tous les sous-dossiers vers le dossier actuel à partir duquel vous commencez la commande; la deuxième partie vérifie si les sous-répertoires sont vides (ils devraient maintenant :-) et les supprime afin que vous obteniez tout ici sans sous-répertoires.

1
X-File