Eu quero fazer algo repetidamente em uma lista de arquivos. Os arquivos nas perguntas têm espaços em seus nomes:
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)
Agora eu quero declarar cada um desses arquivos:
david@david: echo '
for file in $(ls)
do
stat $file
done' | bash
(Eu uso echo e um pipe para escrever comandos de várias linhas.)
Quando faço isso, ele funciona corretamente nos arquivos que não possuem espaços em seus nomes. Mas os outros ...
stat: cannot stat ‘(another’: No such file or directory
stat: cannot stat ‘copy)’: No such file or directory
Alterar $(ls)para "$(ls)"ou $filepara "$file"não funciona. O que eu posso fazer?
Editar:
echo '
for files in *
do
stat "$files"
done' | bash
faz o truque! Como sou iniciante no bash, quero manter as coisas o mais simples possível - nada tentando escapar dos espaços, usando xargsou a solução read -r, embora eles resolvam o problema.
Como alguns perguntaram: Sim, usar isso em vez de stat *é estranho. Mas eu só queria encontrar uma maneira geral de aplicar o mesmo comando em vários nomes de arquivos no bash, usando um loop for. Então, statpoderia significar gzip, gpgou rm.
stat *? (;-)