Voglio fare qualcosa ripetutamente su un elenco di file. I file nelle domande hanno spazi nei loro nomi:
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)
Ora voglio stat ciascuno di questi file:
david@david: echo '
for file in $(ls)
do
stat $file
done' | bash
(Uso echo e una pipe per scrivere comandi multilinea.)
Quando lo faccio, funziona correttamente su quei file che non hanno spazi nei loro nomi. Ma gli altri ...
stat: cannot stat ‘(another’: No such file or directory
stat: cannot stat ‘copy)’: No such file or directory
Il passaggio $(ls)a "$(ls)"o $filesu "$file"non funziona. Cosa posso fare?
Modificare:
echo '
for files in *
do
stat "$files"
done' | bash
fa il trucco! Dato che sono nuovo a bash, voglio mantenere le cose il più semplice possibile, quindi niente con il tentativo di sfuggire agli spazi, o usando xargso la soluzione con read -r, sebbene risolvano il problema.
Come alcuni hanno chiesto: Sì, usare questo invece di stat *è strano. Ma volevo solo trovare un modo generale per applicare lo stesso comando su un mucchio di nomi di file in bash, usando un ciclo for. Quindi statpotrebbe rappresentare gzip, gpgo rm.
stat *? (;-)