Excluindo arquivos específicos na linha de comando

8

Eu tenho os arquivos fileName_1 , fileName_2 ... fileName_100000 onde os fileNames são numerados seqüencialmente. Como posso excluir os arquivos do índice maiores que, digamos 100 ?

teaLeef
fonte

Respostas:

17

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

rm fileName_{100..100000}
cioby23
fonte
3
Info: Isso funciona porque o bash (seu shell) expandirá {x..y}para a lista inteira. Por exemplo, se você usá- echo test{1..3}lo, ele será expandido echo test1 test2 test3e executado. Como você pode ver, ele imprime test1 test2 test3. Da mesma forma, se {x..y}não estiver conectado a nenhum argumento, ele apenas colocará os números lá. Por exemplo echo test {1..3}, apenas imprimirá test 1 2 3.
Luc
1
Nota: existe um limite imposto pela execchamada ao número de argumentos que um processo pode ter. Você pode recuperá-lo com getconf ARG_MAX. Por exemplo, no meu sistema, é 2097152(~ 2,1 milhões). Isso significa que rm(que não é um built-in) falhará com mais do que muitos arquivos. Os comandos internos não têm esse problema e as outras soluções propostas também não.
Bakuriu 15/05
Observe que ARG_MAX é um número de bytes, não um número de argumentos. A rm não consegue lidar com a exclusão de arquivos 2097152 de uma vez. Ele podia excluir 2048 arquivos, cada um com um nome com 1023 bytes (não 1024; os delimitadores entre argumentos (\ 0 em C-land) contam para o limite).
godlygeek
6

Você pode tentar este comando também,

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

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

Avinash Raj
fonte
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 forlaço

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

não sofre com esse problema, mas é uma maneira relativamente lenta de excluir os arquivos, pois o shell precisa executar a substituição de variável e iniciar a rm cerca de 100.000 vezes.

Os dois métodos acima podem causar avisos se alguns dos arquivos, por exemplo, filename_101 estiverem ausentes.

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

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

ainda lançará o rmprograma cerca de 100.000 vezes, enquanto a substituição 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 direcionar:

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

Portanto, nesse caso, você excluiria um arquivo que desejava manter e deixaria os arquivos que deveriam ter sido removidos.

Stefan Schmiedl
fonte
4

Use o seguinte comando:

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

Isso excluirá arquivos de 100 a 100000.

Mais informações: Site

nux
fonte
Você seria melhor usar +ao invés de \;- veja aqui . Ou, melhor ainda, use o -deletecomando find .
Evilsoup
Eu testei isso e ele excluiu apenas fileName_1. A [100-100000] classe de caracteres corresponde apenas um único personagem, por isso só pode corresponder 0 ou 1.
deltab