Estou tentando escrever um comando bash que excluirá todos os arquivos correspondentes a um padrão específico - nesse caso, são todos os arquivos de log antigos do vmware que foram criados.
Eu tentei este comando:
find . -name vmware-*.log | xargs rm
No entanto, quando executo o comando, ele é bloqueado em todas as pastas que possuem espaços em seus nomes. Existe uma maneira de formatar o caminho do arquivo para que o xargs o passe para rm entre aspas ou escape corretamente?
Respostas:
Geralmente acho que usar a
-exec
opção parafind
ser mais fácil e menos confuso. Tente o seguinte:Tudo o que se
-exec
segue é considerado um comando para executar para cada resultado, até o;
, que é escapado aqui para que seja passado parafind
. O{}
é substituído pelo nome do arquivo quefind
normalmente seria impresso.Depois de verificar se faz o que deseja, você pode remover o
-i
.fonte
Se você possui o GNU,
find
pode usar a-delete
opção:Para usar
xargs
e evitar o problema com espaços nos nomes de arquivos:No entanto, seus arquivos de log não devem ter espaços em seus nomes. É provável que os documentos de processamento de texto e os arquivos MP3 os tenham, mas você deve poder controlar os nomes dos seus arquivos de log.
fonte
Você pode dizer
find
para delimitar a lista de saída com NULLs exargs
receber a mesma lista de entrada:Além disso, certifique-se de escapar da
*
barra invertida ou contendovmware-*.log
aspas simples, caso contrário, seu shell poderá tentar expandi-lo antes de passá-lo parafind
.fonte
Não esqueça a
-delete
opção de encontrar . Ele remove o arquivo sem erros com caracteres especiais ...fonte