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

36

Comment déplacer des 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 me retrouver avec tous les fichiers (principalement .mp3 mais pas tous) dans un répertoire, sans sous-répertoires du tout, en utilisant Ubuntu.

Aidez-moi?

Chris
la source

Réponses:

48

Le askubuntu-QA offre une excellente réponse .

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:

Toutefois, 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' -maxdepthoption spécifie à quelle profondeur find doit essayer, 1c'est-à-dire uniquement le répertoire spécifié dans la commande find. Vous pouvez essayer d'utiliser 2, 3également pour tester.

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

La source

Christian Wörz
la source
Si ce que je veux faire, c'est copier tous les fichiers dans le dossier, dois-je simplement changer mv en cp? Je suis nouveau sur linux
Neoryder
13

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 l’ /dst/dirutilisation 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' -iname "*.mp3"option à la findcommande après -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 mvla solution avec -exec +n'a pas besoin d'appeler une commande supplémentaire telle que xargsou parallelet 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 suffixe ~3~seront cachées dans la plupart des fichiers gérés par défaut. Malheureusement, mvne permet pas de changer le suffixe, mais il pourrait facilement être post-traité par des commandes supplémentaires. Ceci est une extension GNU.
  3. Contrairement aux -print0 -exec command {} +normes IEEE 1003.1 (POSIX), ISO / IEC 9945 et les spécifications Single UNIX Specification. Ainsi, il devrait être plus portable. Voir IEEE Standard 1003.1, édition 2004 , IEEE Standard 1003.1, édition 2013 et 0000243: Ajoutez -print0 à "find" . Quoi qu'il en soit, le -tcommutateur requis mvest une extension GNU, de sorte que la totalité de la commande n'est pas portable entre les systèmes POSIX.

Note: Dans le cas findserait en mesure de produire des chemins commençant par -(je ne sais pas d'une telle mise en œuvre findau moment.) La {}doit être précédée par l'indicateur de fin de choix: --.

Pabouk
la source
Erreur: trouver: argument manquant avec `-exec '
Chris
@Chris: Vous avez raison, il semble que ce {}soit le dernier argument. Corrigée.
Pabouk
@Chris: Cela fonctionne-t-il maintenant comme vous le souhaitiez? Si oui, vous pouvez probablement accepter la réponse afin que votre question n'apparaisse pas comme "non résolue".
Pabouk
C’est ce que j’exécute et j’obtiens des erreurs de répertoire introuvable:
Chris
ce que je cours: clstal @ clap: ~ $ ls 1er script.R Firefox_wallpaper.png part1vidproj gestionnaire de pdf zotero Desktop mozilla.pdf Images Documents parent Vidéos clstal @ clap: ~ $ find / source / répertoire -type f -exec mv -t / destination / directory {} + find: `/ source / directory ': Aucun fichier ou répertoire de ce type
Chris
2

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 /srcest un parent de la /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 situé en dehors de mon /srcordinateur, puis j'ai réexécuté la commande pour les replacer dans le /src/../dstrépertoire dans lequel je voulais qu'ils se retrouvent.

MackAltman
la source
2

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.

X-File
la source
(1) Veuillez expliquer en quoi consiste votre réponse et ses avantages par rapport aux autres réponses (qui sont très similaires). S'il vous plaît ne répondez pas dans les commentaires; éditez  votre réponse pour la rendre plus claire et plus complète. (2) Notez que l' -notopérateur n'est pas standard, votre commande est donc moins portable que les autres.
Scott
trouver . -not -type d -print0 | xargs -0J% mv -f%. ; trouver . -type d -depth -print0 | xargs -0 rm -rf J'ai exécuté cette commande dans un dossier et supprimé les sous-dossiers, le dossier dans lequel je me trouvais, puis j'ai été transféré dans le dossier parent. Heureusement, je surveillais mon gestionnaire de fichiers et j'ai réussi à arrêter la commande, qui a été exécutée dans un dossier de test.
Est-ce que
1

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

Lion
la source