Eu tenho folderA
que tem 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 folderA
. Alguém poderia aconselhar como fazer isso usando o shell script?
command-line
bash
scripts
Tak
fonte
fonte
rm a_000[89]* a_0007[5-9]*
?a_000[89]*
inclui todos os arquivos que começam coma_0008
oua_0009
ea_0007[5-9]*
incluem todos os arquivos que começam coma_0007
e, em seguida, contêm um número entre 5 e 9, seguido por qualquer coisa.Respostas:
Supondo que você saiba ou possa adivinhar o final do intervalo, você pode usar expansões de chaves :
O item acima excluirá os 101 arquivos entre a_000750 e a_000850 inclusive (e reclamará dos nomes de arquivos que se referem a arquivos inexistentes). Se você tiver muitos arquivos para isso, use
find
:Aqui, o
find
simplesmente lista todos os arquivos correspondentesa_*
. A lista é passada para umwhile
loop em que cada nome de arquivo é lido na variável$file
. Em seguida, usando os recursos de manipulação de seqüência de caracteres do bash , se a parte numérica (localizar imprime arquivos como./file
, portanto,${file#./a_}
imprime apenas o número) for000750
maior ou maior, o arquivo será excluído. O-v
está lá para que você possa ver quais arquivos foram removidos.Observe que o acima pressupõe nomes de arquivos sãos. Se seus nomes puderem ter espaços, novas linhas ou outros caracteres estranhos, use isso:
fonte
[[
?[[
não simplifica as coisas aqui,[[ "${file#./a_}" > 000749 ]]
por exemplo, nem a torna mais curta. Eu não gosto de usar sintaxe desnecessária e essa funcionará mesmo em shells mais simplesdash
.[[
lida melhor com espaços e estranhezas (eu também não ligo muito>
).[
é bom se você citar a variável como eu tenho, funciona em muito mais conchas e é mais simples.Você poderia fazer algo assim:
Ou:
O primeiro método assume um prefixo fixo, retira-o e verifica o valor.
O segundo método assume um sufixo de tamanho fixo (e um prefixo fixo comum) e se baseia nesse fato; e que, embora
201
venha antes31
em lexicograficamente, não antes031
.Teste isso com o
echo
comando e, quando tiver certeza de que ele lista os arquivos corretos, use-orm
.fonte
Solução shell POSIX
A primeira solução do terdon depende da expansão de chaves, que é uma propriedade de
bash
eksh
, no entanto, não pode ser usada no/bin/sh
shell padrão , no qual o Ubuntu está vinculado/bin/dash
.Nos casos em que você precisa confiar
/bin/sh
na portabilidade de seus scripts, geralmente há duas maneiras de abordar isso. Um seria via globbing. Apenascd folderA
e de lá corrarm a_*
. Por outro lado, seria implementar uma alternativa para loop no estilo C usandowhile <CONDITION>;do ...done
na linguagem shell e formatar os números comprintf
:Observe que aqui eu uso
echo
. Substituaecho "$filename"
porrm ./"$filename"
ourm -- "$filename"
quando estiver pronto para excluir os arquivos. Observe também que isso deve ser realizado quando você já estivercd
no diretório desejado.(ab) usando awk
O awk, sendo uma linguagem C agradável, pode nos ajudar de duas maneiras: (1) podemos gerar nomes de arquivos com loop for e formatá-los via
sprintf
função e (2) excluir os arquivos porsystem()
comando, o que passará nosso nome de arquivo erm
comando gerados para/bin/sh
:Perl
Continuando com a idéia de abordagem portátil onde "geramos" nomes de arquivos, podemos fazer o mesmo no Perl:
fonte
Tão simples quanto
No seu exemplo é
fonte
a_00075
...