Je veux faire quelque chose à plusieurs reprises sur une liste de fichiers. Les fichiers des questions ont des espaces dans leurs noms:
david@david: ls -l
total 32
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha
-rw-rw-r-- 1 david david 0 Mai 8 11:55 haha~
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (3rd copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (4th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (5th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (6th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (7th copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (another copy)
-rw-rw-r-- 1 david david 13 Mai 8 11:55 haha (copy)
Maintenant, je veux statuer chacun de ces fichiers:
david@david: echo '
for file in $(ls)
do
stat $file
done' | bash
(J'utilise echo et un pipe pour écrire des commandes multilignes.)
Lorsque je fais cela, cela fonctionne correctement sur les fichiers qui n'ont pas d'espace dans leurs noms. Mais les autres ...
stat: cannot stat ‘(another’: No such file or directory
stat: cannot stat ‘copy)’: No such file or directory
Le passage $(ls)à "$(ls)"ou $fileà "$file"ne fonctionne pas. Que puis-je faire?
Éditer:
echo '
for files in *
do
stat "$files"
done' | bash
fait l'affaire! Comme je suis nouveau dans bash, je veux garder les choses aussi simples que possible - donc rien avec essayer d'échapper aux espaces, ou d'utiliser xargsou la solution avec read -r, bien qu'ils résolvent le problème.
Comme certains l'ont demandé: Oui, utiliser cela au lieu de stat *est bizarre. Mais je voulais juste trouver un moyen général d'appliquer la même commande sur un tas de noms de fichiers en bash, en utilisant une boucle for. Ainsi statpourrait représenter gzip, gpgou rm.
stat *? (;-)