Déplacer uniquement les fichiers récursivement de plusieurs répertoires dans un seul répertoire avec mv

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.

  • Le répertoire /path/to/master doit déjà exister (il ne sera pas créé par cette commande).
  • Assurez-vous que le répertoire /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.