Eu tentei correr
locate *.orig | xargs rm
mas disse No such file or directory
Eu já vi maneiras de fazer isso, findmas 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, findmas 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,--nullSepare 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 *.origcom aspas, para evitar a expansão do shell, e passá-lo para localizar intocado.
| while readpois 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 locatenão veja a string exata *.origcomo deveria.
tr '\n' '\0'.
É xargsnãoxarg
O comando locate *.orig | xargs rmfunciona realmente, mas o que estava acontecendo era que locateestava achando *.origarquivos na lata de lixo e rmcospe o erro No such file or directoryao 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