<p>Cela peut être fait avec une seule commande exiftool. Exiftool a une puissante capacité de traitement par lots intégrée et il n’est presque jamais nécessaire de créer un script.</p>
<p>La seule mise en garde est que vous devez d’abord vous placer avec CD dans le répertoire qui est le sommet de l’arborescence que vous voulez préserver. Dans votre exemple, vous pourriez d’abord faire CD dans <code>F:\testFindNoKeywords</code></p>
<p>Vous pourriez ensuite exécuter cette commande dans Windows CMD (pas PowerShell). Si vous l’exécutez sur Mac/Linux, vous pourriez changer les guillemets doubles en guillemets simples :</p>
<p><code>exiftool -r -if "not $keywords and not $subject" "-Directory=F:\testFindNoKeywordsResult\%d" .</code></p>
<p>Détail :</p>
<ul>
<li>
<p><code>-r</code> : L’<a href="https://ExifTool.org/exiftool_pod.html#r-.--recurse">option récursive ( PH5 )</a>. Avec cela, exiftool parcourra tous les sous-répertoires.</p>
</li>
<li>
<p><code>-if</code> : L’<a href="https://exiftool.org/exiftool_pod.html#if-NUM-EXPR">option conditionnelle</a>. Cela prendra le paramètre suivant, qui doit être une expression de code Perl, et comparera les données de chaque fichier à cette expression.</p>
</li>
<li>
<p><code>-Directory</code> : Cela indique à exiftool que ce sera une opération de déplacement vers le répertoire indiqué. La variable <code>%d</code> est remplie avec le chemin du répertoire vers le fichier en cours de traitement. La valeur sera basée sur le répertoire donné en ligne de commande. Si la ligne de commande reçoit un chemin absolu, alors cela contiendra le chemin absolu vers le fichier. C’est pourquoi vous devez faire CD dans le répertoire au sommet de l’arborescence que vous voulez copier. Le résultat sera le chemin relatif vers le répertoire, qui peut être ajouté au nouvel emplacement de répertoire.</p>
</li>
<li>
<p><code>.</code> : Le point représente le répertoire courant.</p>
</li>
</ul>
<p>Voici un exemple de sortie. Les fichiers <code>1.jpg</code> et <code>2.jpg</code> ont chacun une entrée dans <code>Keywords</code> ou <code>Subject</code>. Le fichier <code>3.jpg</code> n’a aucun mot-clé. Le résultat est que le fichier <code>3.jpg</code> est déplacé vers le nouveau répertoire tout en préservant l’arborescence de répertoires.</p>
<pre><code class="lang-auto">Y:!temp\x\y>tree .\a /f
Folder PATH listing for volume DrivePool
Volume serial number is 3881-4F27
Y:!TEMP\X\Y\A
│ 1.jpg
│
└───b
│ 2.jpg
│
└───c
3.jpg
Y:!temp\x\y>exiftool -G1 -a -s -Keywords -Subject -r .\a
======== ./a/1.jpg
[XMP-dc] Subject : 1
======== ./a/b/2.jpg
[IPTC] Keywords : 2
======== ./a/b/c/3.jpg
3 directories scanned
3 image files read
Y:!temp\x\y>exiftool -r -if "not $keywords and not $subject" "-Directory=Y:!temp\x\y\NoKeywordsFound\%d" .\a
3 directories scanned
1 directories created
2 files failed condition
1 image files updated
0 image files read
Y:!temp\x\y>tree /f Y:!temp\x\y\NoKeywordsFound
Folder PATH listing for volume DrivePool
Volume serial number is 3881-4F27
Y:!TEMP\X\Y\NOKEYWORDSFOUND
└───a
└───b
└───c
3.jpg
</code></pre>
<p>Il est important de noter que vous ne devez <strong>pas</strong> utiliser exiftool dans une boucle, en l’appelant une fois par fichier. Le plus gros impact sur les performances d’Exiftool est le temps de démarrage et l’appeler en boucle sur plus de 10 000 fichiers augmentera considérablement le temps de traitement. Voir <a href="https://exiftool.org/mistakes.html#M3">Exiftool Common Mistake #3, “Over-scripting”</a></p>