Como posso excluir arquivos numerados em um determinado intervalo?

Como posso excluir arquivos numerados em um determinado intervalo?

Eu tenho folderAalguns arquivos com uma sequência numérica começando com a_000000. O que eu quero fazer é excluir arquivos a partir de um número específico: digamos a_000750até o final dos arquivos neste arquivo folderA. Alguém poderia aconselhar como fazer isso usando shell script?

Responder1

Supondo que você saiba ou possa adivinhar o final do intervalo, você poderia usarexpansões de chaves:

rm a_{000750..000850}

O procedimento acima excluirá os 101 arquivos entre a_000750 e a_000850 inclusive (e reclamará de nomes de arquivos que se referem a arquivos inexistentes). Se você tiver muitos arquivos para isso, use find:

find . -name 'a_*' | while read -r file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

Aqui, findsimplesmente lista todos os arquivos correspondentes a a_*. A lista é passada para um whileloop onde cada nome de arquivo é lido na variável $file. Então, usando o bashmanipulação de cordasrecursos, se a parte numérica (localizar imprime arquivos como ./file, portanto ${file#./a_}imprime apenas o número) for 000750ou maior, o arquivo será excluído. O -vestá lá apenas para que você possa ver quais arquivos foram removidos.

Observe que o texto acima pressupõe nomes de arquivo corretos. Se seus nomes puderem conter espaços, novas linhas ou outros caracteres estranhos, use isto:

find . -name 'a_*' -print0 | while IFS= read -rd '' file; do 
  [ "${file#./a_}" -gt 000749 ] && rm -v "$file" 
done

Responder2

Você poderia fazer algo assim:

find . -regextype posix-extended -iregex './a_[0-9]{6}' -execdir bash -c '[[ ${1##./a_} > 000750 ]] && echo $1' "removing: " {} \;

Ou:

find . -regextype posix-extended -iregex './a_[0-9]{6}' | sort | sed '0,/000750/d' | xargs echo

O primeiro método assume um prefixo fixo, retira-o e verifica o valor.

O segundo método assume um sufixo de comprimento fixo (e um prefixo fixo comum) e depende desse fato; e que, embora 201venha antes 31lexicograficamente, não acontece antes 031.

Teste isso com o echocomando e, quando tiver certeza de que ele lista os arquivos corretos, use-o rm.

Responder3

No Bash você pode executar:

for i in {1001..3000} ; do rm file_"$i".dat ; done

Responder4

Tão simples quanto

rm partialfilename* -f

No seu exemplo é

rm a_00075* -f

informação relacionada