Eu tenho folderA
alguns 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_000750
até 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, find
simplesmente lista todos os arquivos correspondentes a a_*
. A lista é passada para um while
loop 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 000750
ou maior, o arquivo será excluído. O -v
está 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 201
venha antes 31
lexicograficamente, não acontece antes 031
.
Teste isso com o echo
comando 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