Normalmente, para remover arquivos com espaços em seus nomes de arquivo, você teria que 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.
command-line
find
rm
xargs
Ashley
fonte
fonte
find -name "*\ *.txt" | xargs rm
funciona para arquivos com duas palavras?Respostas:
Você pode dizer
find
exargs
usar terminadores nulosou (mais simples) use a
-delete
ação interna defind
ou (obrigado @kos)
qualquer um deles deve respeitar o
ARG_MAX
limite do sistema sem a necessidadexargs
.fonte
ARG_MAX
eu também vou mencionar quefind . -name "*.txt" -exec rm {} \;
seria um "tiro seguro"-print0
deve ser a última opção (ou pelo menos após-name "*.txt"
), caso contrário este vai bater arquivos já não se limita a*.txt
...Aliás, se você usou algo diferente de find, poderá usar tr para substituir as novas linhas por bytes nulos.
Por exemplo. o liner a seguir exclui os 10 últimos arquivos modificados em um diretório, mesmo que eles tenham espaços em seus nomes.
ls -tp | grep -v / | head -n 10 | tr "\n" "\0" | xargs -0 rm
fonte
O comando xargs usa tabulações, espaços e novas linhas como delimitadores por padrão. Você pode dizer para ele usar apenas caracteres de nova linha ('\ n') com a opção -d:
find . -name "*.txt" | xargs -d '\n' rm
Resposta de origem no SO .
fonte
-0
vez de-d
(paraxargs
) para sistemas BSD. O que o Ubuntu usa? A resposta aceita aqui usa-0
. O que é correto?