Excluindo arquivos específicos com base no nome do arquivo do terminal

13

Eu tenho um diretório contendo arquivos com nomes

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

e assim por diante. Eu gostaria de deletar todos aqueles que são múltiplos de 5000.

Eu tentei o seguinte: printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rm , mas isso me deu a resposta rm: missing operand .

Existe outra maneira de fazer isso?

    
por BillyJean 18.10.2017 / 19:28

4 respostas

49

Você não precisa de um loop ou de comandos extras nos quais tenha Bash Shell Brace Expansion .

rm -f rho_{0..200000..5000}.txt

Explicação : {start..end..step} . O -f para ignorar o prompt em arquivos inexistentes.

p. Para manter a segurança e verificar quais arquivos serão excluídos, faça um teste primeiro com:

ls -1 rho_{0..200000..5000}.txt
    
por 18.10.2017 / 19:57
13

rm não lê da entrada padrão. Você poderia fazer:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

Eu incluo a opção -i em rm para avisar antes da remoção para que você possa verificar o comportamento. Quando você estiver confiante de que está fazendo o que deseja, poderá omitir essa opção.

Editar: Como alternativa, você pode fazer:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

Esse formulário pode ser mais familiar se você tiver feito alguma programação.

    
por 18.10.2017 / 19:33
12

Você não pode canalizar para um programa como se o conteúdo do pipe fosse argumentos. É enviado através de stdin.

Você deve usar o xarg para essa finalidade:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

mas primeiro você pode experimentar com o echo para ver se tudo está como você pretende:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
    
por 18.10.2017 / 19:33
9

Alguém me corrija se eu estiver errado, mas se todos os arquivos que começam com rho_ forem dessa forma, não é equivalente a fazer

rm rho_0.txt rho_*[05]000.txt

Como um número (diferente de 0) é um múltiplo de 5000 se e somente se terminar em 0000 ou 5000.

(0 é um caso especial, já que é um múltiplo de 5000, mas é normalmente escrito sem zeros iniciais adicionais. Se você não pretendia incluir 0, retire-o da linha acima.)

É claro que isso só deve ser usado se todos os arquivos rho_*.txt em seu diretório tiverem o formulário desejado. Não use se seu diretório também contiver rho_please_dont_delete_me_5000.txt .

(Nota matemática: Isso funciona precisamente porque todos os fatores primos de 5000, 2 e 5, também são fatores primos da base em que estamos trabalhando, 10. Equivocadamente, há uma potência suficientemente grande de 10 (isto é, 10.000). ) que é divisível por 5000. Não existe um truque similar para combinar todos aqueles que são múltiplos de 3000.)

    
por 19.10.2017 / 16:26

Tags