Je veux faire un time lapse à partir d'un dossier d'images, mais il y en a trop et le time lapse progresse trop lentement. Comment puis-je sélectionner, par exemple, chaque 10ème élément, et soit copier soit déplacer les éléments dans un dossier séparé ?
Réponse
Trop de publicités?La manière la plus rapide est d'utiliser la syntaxe bash
et awk
dans votre Terminal.app
for file in `find /SOURCE/DIR -type f | awk 'NR %10 == 0'`; do echo mv $fichier /DEST/DIR ; done
La déclaration for
introduit la boucle bash
, pour itérer à travers un ensemble de données où fichier
est la variable.
find
analyse le /SOURCE/DIR
pour ce qui est spécifié.
|
agit comme un pipe, passant les résultats de find
à stdin
awk
interprète stdin et affiche uniquement les lignes répondant aux conditions spécifiées par 'NR %10 == 0’
-
NR
est unevariable intégrée awk
qui spécifie le numéro d'enregistrement/ligne à évaluer. -
%
est unopérateur numérique
indiquant à awk que le(s) caractère(s) suivant(s) doit être traité en tant que tel(s). -
==
est l'opérateur relationnel pourdoit être égal à..
-
0
est l'expression binaire pourTRUE
Alors, pour résumer: "trouver chaque 10ème fichier qui existe dans ce répertoire et l'afficher";
do
introduit l'action à effectuer sur la sortie.echo
est utilisé pour vérifier la commande, dont les résultats seront affichés à stdout. Si tout semble bon, retirez-le et exécutez l'action (mv
,cp
)mv
est une commande bash intégrée pour déplacer (ou renommer) un fichier.cp
est une autre commande bash intégrée pour déplacer un fichier d'un répertoire à un autre tout en préservant l'original. Vous pouvez directement substituercp
àmv
si vous souhaitez conserver le contenu du répertoire d'origine.$fichier
fait référence à la variablefichier
qui a maintenant été définie.
Donc, pour résumer : dites-moi ce qui se passe lorsque je…(echo
) "déplacez (ou, copiez) tous les fichiers spécifiés par les paramètres précédents vers cet autre répertoire;"
done
En résumé, indique à bash de terminer la boucle puisque vous avez terminé :)