Resultados do tubo de localização em rm

11

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

soldier.moth
fonte

Respostas:

20

Se os nomes de arquivos contiverem espaços, você deve usar

locate -0 $something | xargs -0 rm

Na locatepágina do manual :

-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.

enzotib
fonte
O que você quer dizer com "expansão de shell"?
soldier.moth
+1 para o seu segundo exemplo. Eu sempre uso, | while readpois meu diretório pessoal está cheio de arquivos com espaços.
matpie
@ Soldier.moth: se na pasta atual houver arquivos correspondentes ao padrão *.orig, o shell expandirá o padrão para, digamos file1.orig file2.orig ..., para que locatenão veja a string exata *.origcomo deveria.
enzotib 23/10/10
Também para grep localizar a saída, você pode então tr '\n' '\0'.
Pablo Bianchi
2

É xargsnãoxarg

maco
fonte
Foi o que eu quis dizer foi digitar a pergunta da memória, obrigado.
soldier.moth
Ah ok. Parecia o erro que você obteria ao colocar um comando incorreto após |
maco 22/10/10
0

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.

soldier.moth
fonte
Você deve adicionar informações como um "comentário" à resposta original ou pode editar a resposta original. Esta não é uma resposta para sua própria pergunta.
enzotib 23/10/10
É uma resposta à minha pergunta porque o erro ocorreu porque o localizador estava encontrando arquivos * .orig na lixeira e a rm não os excluía. Aceitei sua resposta e votei em ambas as outras respostas, porque elas foram bem escritas e podem ajudar alguém que aparecer mais tarde.
amigos estão
0

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.

Usuário desconhecido
fonte
0

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 
Abdennour TOUMI
fonte