Remove arquivos em um diretório com ls grep e rm

1

Eu tenho um arquivo bash no meu projeto raiz com esta linha

$ ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

A linha acima remove todos os arquivos .txt da raiz do projeto, mas quando eu envio todos os arquivos .txt para outra pasta, por exemplo, process_logs / e experimento os mesmos comandos com ls , grep e rm não funciona.

Isso é o que eu tentei mas não trabalhei para remover arquivos no diretório process_logs .

 $ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

N.B : Eu também tentei o comando com um padrão regex simples como   ls process_logs/ | grep -P '^*.txt$' | xargs rm -f para remover arquivos do diretório, mas não funciona.

    
por Curious_MInd 28.04.2018 / 07:36

3 respostas

2

Tente usar find . Se você não quiser que find seja recursivo, poderá usar as opções de profundidade:

find /process_logs -maxdepth 1 -mindepth 1 -type f -name 'some_shell_glob_pattern_here' -delete

A análise da saída de ls não é recomendada porque ls nem sempre é preciso porque ls imprime uma versão legível do nome do arquivo, que pode não corresponder ao nome real do arquivo. Para mais informações, consulte o artigo da wiki parsing ls .

    
por 28.04.2018 / 07:49
1

Concordo com usando o find é a melhor opção . Mas quero adicionar por que seu comando não está funcionando.

Seu comando:

$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

ls produz nomes de arquivos sem o caminho . Mas você não adiciona o caminho para rm . Então, ele tentará excluir nomes de arquivos do seu subdiretório no diretório / root atual.

Tente

$ cd process_logs/; ls | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs rm -f

Ou

$ ls process_logs/ | grep -P '^some_pattern_matching_regex_goeshere.txt$' | xargs -i rm -f "process_logs/{}"
    
por 28.04.2018 / 08:18
0

Se você tiver um padrão de globbing de nome de arquivo de shell simples, use isso.

Por exemplo (o * pode ser substituído por algum padrão mais preciso),

rm -f process_logs/*.txt

ou, se houver centenas de milhares de arquivos, use xargs :

printf '%s
find process_logs -maxdepth 1 -type f -regex '\.txt$' -delete
' process_logs/*.txt | xargs -0 rm -f

Se você absolutamente precisar usar uma expressão regular, o GNU find poderá fazer isso com

rm -f process_logs/*.txt

Observe que o predicado -regex corresponde ao nome do caminho completo, não apenas à parte do nome do arquivo no final (é por isso que ancorei a expressão no final do nome do caminho com $ ). Veja também a opção -regextype no manual GNU find .

    
por 07.05.2018 / 20:29

Tags