Excluindo arquivos específicos na linha de comando

8

Eu tenho arquivos fileName_1 , fileName_2 ... fileName_100000 em que fileNames são numerados sequencialmente. Como posso excluir os arquivos de índice maiores que, digamos, 100 ?

    
por teaLeef 15.05.2014 / 11:12

4 respostas

17

Se os nomes dos arquivos forem numerados sequencialmente, basta executar o seguinte comando:

rm fileName_{100..100000}
    
por cioby23 15.05.2014 / 11:18
6

Você também pode tentar este comando,

for i in $(seq 100 100000); do rm fileName_$i; done

Ele excluirá todos os arquivos (varia de 100 a 100.000) se o nome do arquivo contiver números em uma ordem seqüencial.

    
por Avinash Raj 15.05.2014 / 14:26
5

Em geral, você tem várias maneiras de conseguir isso:

rm fileName_{100..100000}

será expandido pelo shell em aproximadamente 100.000 nomes de arquivos. Se o nome da base for um caminho longo e o número for alto o suficiente, você poderá realmente exceder o comprimento máximo de uma linha de comando com essa abordagem.

O for loop

for i in $(seq 100 100000); do rm fileName_$i; done

não sofre com este problema, mas é uma maneira relativamente lenta de deletar os arquivos, já que o shell tem que executar a substituição de variáveis e executar o rm cerca de 100.000 vezes.

Ambos os métodos acima podem causar avisos se alguns dos arquivos, digamos, filename_101 estiverem faltando.

Geralmente, as soluções baseadas em find são melhores, pois funcionam apenas em arquivos que estão lá (durante a descoberta). No entanto, existem algumas diferenças sutis:

find . -name 'fileName_[100-100000]' -exec rm {} \;

ainda lançará o programa rm cerca de 100.000 vezes, enquanto que a substituição da% final\; por + tentará minimizar o número de subprocessos. Ambos os métodos provavelmente serão (muito ou um pouco) mais lentos do que usar -delete , que não usa comandos externos, mas invoca chamadas do sistema.

No entanto, sempre verifique primeiro se o padrão realmente corresponde aos arquivos que você deseja segmentar:

stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]' 
askubuntu/filename_1

Então, neste caso, você excluiria um arquivo que queria manter e deixaria os arquivos que deveriam ter sido removidos.

    
por Stefan Schmiedl 15.05.2014 / 20:09
4

Use o seguinte comando:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Isso excluirá arquivos de 100 a 100.000.

Mais informações: Site

    
por nux 15.05.2014 / 11:59