J’ai actuellement ~ 40k images RAW dans une structure de répertoire nestede. (Certains dossiers ont jusqu’à 100 sous-dossiers remplis de fichiers.) Je voudrais les déplacer tous dans un seul répertoire principal, sans sous-dossiers. Comment cela pourrait-il être accompli en utilisant mv
? Je sais que l’option -r
copiera récursivement, mais cela copie également les dossiers, et je ne souhaite pas avoir de sous-répertoires dans le dossier principal.
Si vos photos sont dans /path/to/photos/
et ses sous-répertoires, et que vous souhaitez vous déplacer dans /path/to/master/
et que vous souhaitez les sélectionner par extension .jpg
, .JPG
, .png
, .PNG
, etc.:
find /path/to/photos \( -iname '*.jpg' -o -iname '*.png' \) -type f -exec mv -nv -t '/path/to/master' -- {} +
Si vous ne souhaitez pas filtrer par extension, et que vous déplacez tout (c.-à-d. Tous les fichiers ):
find /path/to/photos -type f -exec mv -nv -t '/path/to/master' -- {} +
L’option -n
pour ne pas écraser les fichiers existants (facultatif si vous ne vous en souciez pas) et l’option -v
pour que mv
montre ce qu’il fait (très facultatif).
L’option -t
à mv
de spécifier le répertoire cible, de manière à pouvoir emstackr tous les fichiers à déplacer à la fin de la commande (voir le délimiteur +
de -exec
). Si votre mv
ne supporte pas -t
:
find /path/to/photos \( -iname '*.jpg' -o -iname '*.png' \) -type f -exec mv -nv -- {} '/path/to/master' \;
mais ce sera moins efficace, car une instance de mv
sera créée pour chaque fichier.
Btw, cela déplace les fichiers, il ne les copie pas.
Remarques.
/path/to/master
doit déjà exister (il ne sera pas créé par cette commande). /path/to/master
n’est pas dans /path/to/photos
. Cela rendrait la chose embarrassante! -execdir
option -execdir
de find
:
find /path/of/images -type f -execdir mv '{}' /master-dir \;
Comme par man find
:
-execdir utility [argument ...] ; The -execdir primary is identical to the -exec primary with the exception that utility will be executed from the directory that holds the current file. The filename substituted for the ssortingng ``{}'' is not qualified.
Comme -execdir
fait que find
exécute la commande commandée depuis chaque répertoire, seul le nom de fichier de base est déplacé sans chemin parent du fichier.
find -type -f -name \*\.raw -exec mv {} master \;
Si votre hiérarchie n’a qu’un niveau de profondeur, voici une autre façon d’utiliser les outils automatisés de SsortingngSolver :
mv -a firstfolder/firstfile.raw firstfile.raw
Les options -a
appliquent immédiatement la transformation similaire à tous les fichiers similaires au niveau d’imbrication 1 (c’est-à-dire pour tous les autres sous-dossiers). Si vous ne faites pas confiance au système, vous pouvez utiliser d’autres options telles que -e
pour expliquer la transformation ou -t
pour le tester sur tous les fichiers.
DISCLAIMER: Je suis co-auteur de ce travail à des fins académiques et travaillant sur un moteur de rendu de script bash. Mais le système est déjà disponible à des fins de test.