get l'horodatage des files présentés par la boucle FOR

Mon but est de find des files $ sur certains périphériques $ et de les save dans un ou plusieurs dossiers qui correspondent à un horodatage de chaque file. Pour get l'horodatage, je voulais utiliser stat.

Contrairement à echo "$ files", stat ne traite pas chaque file séparément. Au lieu de cela, il semble traiter tous les files à la fois lorsque j'utilise "".

Avez-vous des suggestions sur la façon d'améliorer les citations ou d'autres conseils sur la façon de rendre stat capable de faire ce que je veux faire? Merci beaucoup pour votre aide.

#!/bin/bash for devices in "$(ls /media/*/)"; do for files in "$(find /media/*/$devices -iname *.jpg)"; do echo "$files" # prints all files in separate lines stat "$files" # seems to process all files at once stat $files # splits file paths at spaces done done 

Le problème n'est pas avec stat mais avec datatables source dans votre boucle for ; parce que vous l'avez enfermé entre guillemets, il devient une seule et unique entité.

Pour résoudre ce problème, supprimez les guillemets autour de celui-ci, ainsi:

 for files in $(find /media/*/$devices -iname "*.jpg"); 

Cela fonctionne à condition qu'aucun des files ou des paths n'aient des espaces. Mais il existe une solution plus élégante qui fonctionne avec des espaces et même avec des noms de files bizarres (par exemple ceux qui incluent des citations ou des returns à la ligne):

 while IFS= read -r -d '' file; do # operations on each "$file" here done < <(find /media/*/$devices -type f -iname *.jpg -print0) 

Ne pas parsingr la sortie de ls . Vous ne pouvez pas distinguer une nouvelle ligne introduite par ls d'une nouvelle ligne dans un nom de file. La même chose vaut pour find .

for devices in $(ls /media/*/) est juste un moyen complexe et cassé d'écrire for devices in /media/*/* . Au lieu de for files in $(find …); do …; done for files in $(find …); do …; done for files in $(find …); do …; done , utilisez find … -exec …

Vous n'avez pas besoin des deux loops ici, puisque vous ne faites qu'énumérer les files afin d'utiliser l'set complet plus tard. Votre script est simplement

 find /media/*/* -iname '*.jpg' -exec stat {} + 

Pour plus d'informations, reportez-vous à la section Pourquoi mon script shell se bloque-t-il sur des espaces ou d'autres caractères spéciaux?