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

13

Eu tenho um diretório que contém arquivos com nomes

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

e assim por diante. Gostaria de excluir todos os que são múltiplos de 5000.

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

Há outra maneira de fazer isso?

BillyJean
fonte
6
Independentemente de como você faz isso, recomendo (por segurança) mover os arquivos desejados para um diretório e, quando confirmar que todos e somente os arquivos a serem excluídos estão no diretório, exclua o diretório.
user117529
A segurança é importante aqui. Geralmente testei essas coisas lsprimeiro.
Scot

Respostas:

49

Você não precisa de um loop ou comandos extras onde estiver Bash Shell Brace Expansion.

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

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


Ps 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
αғsнιη
fonte
13

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

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

Incluo a -iopção de rmavisar antes da remoção para que você possa verificar o comportamento. Quando estiver confiante de que está fazendo o que deseja, você poderá omitir essa opção.

Edit: 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.

Andy Dalton
fonte
12

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

Você deve usar o xarg para esta finalidade:

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

mas primeiro você pode tentar com eco para ver se tudo está como você pretende:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo
M4rty
fonte
Se sua versão seqtiver a opção -f/, --formatvocê poderá usá-la em vez dessa printfsolução alternativa e substituição de comando.
David Foerster
Obrigado, eu só respondeu usando o comando usado na questão e tentando explicar seu erro rm
M4rty
9

Alguém me corrija se eu estiver errado, mas se todos os arquivos iniciados rho_tiverem esse formato, não é equivalente a isso

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

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

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

Obviamente, isso só deve ser usado se todos os rho_*.txtarquivos em seu diretório tiverem a forma desejada. Não use se o 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, ou seja, 2 e 5, também são fatores primos da base em que estamos trabalhando, 10. Equivalentemente, existe uma potência suficientemente grande de 10 (ou seja, 10000) que é divisível por 5000. Não existe truque semelhante para combinar todos os que são múltiplos de 3000.)

Nate Eldredge
fonte
Esta é realmente a melhor resposta.
Cesarv 19/10