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?
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 utiliser2
,3
pour tester.Voir la page de manuel Ubuntu find pour une explication détaillée.
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.
Si vous souhaitez déplacer uniquement des fichiers MP3, ajoutez l'option -iname "*.mp3"
à la commande find
après le -type f
.
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.
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.--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.-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: --
.
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.
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
Le /src
est un parent du /dst
(par exemple, /src/../dst/
).
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.
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.
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.