Piping find -name para xargs resulta em nomes de arquivos com espaços não sendo passados para o comando

25

Normalmente, para remover arquivos com espaços no nome do arquivo, você precisa executar:

$ rm "file name"

mas se eu quiser remover vários arquivos, por exemplo:

$ find . -name "*.txt" | xargs rm

Isso não excluirá arquivos com espaços neles.

    
por Ashley 26.08.2015 / 14:13

3 respostas

47

Você pode dizer a find e xargs para usar os terminadores nulos

find . -name "*.txt" -print0 | xargs -0 rm

ou (mais simples) use a ação -delete integrada de find

find . -name "*.txt" -delete

ou (obrigado @kos)

find . -name "*.txt" -exec rm {} +

qualquer um deles deve respeitar o ARG_MAX limite do sistema sem a necessidade de xargs .

    
por steeldriver 26.08.2015 / 14:19
1

Aliás, se você usou algo diferente de find, você pode usar tr para substituir as novas linhas com bytes nulos.

o seguinte liner exclui os 10 últimos arquivos modificados em um diretório, mesmo que tenham espaços em seus nomes.

ls -tp | grep -v / | head -n 10 | tr "\n" "%code%" | xargs -0 rm

    
por Ibrahim 04.05.2017 / 00:00
0

O comando xargs usa tabulações, espaços e novas linhas como delimitadores por padrão. Você pode dizer para usar somente caracteres de nova linha ('\ n') com a opção -d:

find . -name "*.txt" | xargs -d '\n' rm

Resposta de origem ao SO .

    
por joseph_morris 13.04.2018 / 22:48