bash script para remover arquivos selecionados

1

Eu tenho uma série de arquivos que são nomeados de acordo com field.%d.vtk e são gerados quando eu executo um código C ++. Os códigos fazem uma série de cálculos dentro de um loop for e despejam a saída sempre que i%N == 0 , em que i é a variável de loop e N , é uma constante. Por engano, eu defini N = 1 e agora tenho uma enorme quantidade de dados que eu não preciso. Eu também não quero reexecutar o código.

Como posso escrever um script bash para manter apenas todos os arquivos N , excluir o restante e renomear os arquivos restantes de modo que os números em field.%d.vtk sejam contíguos? Desculpe se isso é trivial, mas tenho uma experiência muito limitada com scripts de bash.

EDIT : Quando o intervalo N=1 (por engano) de %d estaria em [0, 1, ..., O (100,000)] (realmente grande), um% co_de adequado % é algo em torno de N , o que reduziria o número de arquivos para O (1000) ou mais.

Obrigado

    
por GradGuy 28.05.2012 / 05:53

3 respostas

3

Se N = 100, então é muito fácil desmembrá-los. O seguinte irá apagar todos os arquivos que não terminam em 00.vtk

find -name '*.vtk' -not -name '*00.vtk' -exec rm {} +

Então isso deixaria 100.vtk, 200.vtk etc

Depois, para torná-los contíguos, você pode remover o 00:

rename 00.vtk .vtk *.vtk

Isso pressupõe renomeação posix padrão. Se você tem a renomeação do perl instalada, é:

rename 's/00.vtk/.vtk/' *.vtk
    
por 28.05.2012 / 06:39
0
for i in *.vtk
do
    [[ $i =~ \.([0-9]*)\. ]] && ((BASH_REMATCH[1] % 100 != 0)) && echo $i
done

Altere echo para rm quando tiver marcado novamente este comando!

    
por 28.05.2012 / 06:28
0

Versão Bash (4 +) - somente da resposta de Paul (portanto, ele deixará apenas 100 arquivos .vtk de arquivo, aqueles que terminam com 00.vtk e os renomeará, removendo 00 ):

shopt -s extglob
rm ./!(*00).vtk
for f in ./*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done

Se você quiser recursividade:

shopt -s extglob globstar
rm ./**/!(*00).vtk
for f in ./**/*.vtk; do mv "$f" "${f%00.vtk}.vtk"; done
    
por 12.06.2013 / 22:40

Tags