Eu tentei correr
locate *.orig | xargs rm
mas disse No such file or directory
Eu já vi maneiras de fazer isso, find
mas o local retorna o caminho completo para o objeto, para que seja possível
Eu tentei correr
locate *.orig | xargs rm
mas disse No such file or directory
Eu já vi maneiras de fazer isso, find
mas o local retorna o caminho completo para o objeto, para que seja possível
Respostas:
Se os nomes de arquivos contiverem espaços, você deve usar
locate -0 $something | xargs -0 rm
-0
,--null
Separe as entradas na saída usando o caractere ASCII NUL em vez de gravar cada entrada em uma linha separada. Esta opção foi projetada para interoperabilidade com a opção --null do GNU xargs (1).
ou
locate $something | while read f; do rm "$f"; done
Além disso, você deve proteger *.orig
com aspas, para evitar a expansão do shell, e passá-lo para localizar intocado.
| while read
pois meu diretório pessoal está cheio de arquivos com espaços.
*.orig
, o shell expandirá o padrão para, digamos file1.orig file2.orig ...
, para que locate
não veja a string exata *.orig
como deveria.
tr '\n' '\0'
.
É xargs
nãoxarg
O comando locate *.orig | xargs rm
funciona realmente, mas o que estava acontecendo era que locate
estava achando *.orig
arquivos na lata de lixo e rm
cospe o erro No such file or directory
ao tentar excluir arquivos na lata de lixo.
localizar não faz o globbing, mas o shell faz. O shell expande * .orig para o que encontra no diretório atual que corresponde a * .orig.
Apenas use
locate .orig
e se isso te dá o que você precisa
locate .orig | xargs rm
ou, como o enzotib mencionou
locate -0 .orig | xargs -0 rm
se você tiver espaço em branco nos nomes dos arquivos.
Um truque: salve todos os caminhos no arquivo tmp. então, faça um loop nele:
#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
pth=$line
rm "$pth"
done < /tmp/tmp.txt
rm -rf /tmp/tmp.txt