Como posso copiar e mover um subconjunto seqüencial de arquivos?

2

Eu tenho um diretório contendo 1772 arquivos chamados PRC0001, PRC002, ... até PRC1772.

Como posso copiar um subconjunto, por exemplo, PRC0257 para PRC1516 para um diretório diferente? Estou tentando fazer isso para vários grupos desses arquivos, embora todos os grupos comecem em um determinado número e continuem sequencialmente até o último item desse grupo.

Estou tentando fazer isso com um script de shell bash e um arquivo parameter.txt ...

    
por Kdestasio 24.02.2015 / 02:59

2 respostas

1

Selecione o intervalo entre chaves:

cp PRC{0257..1516} destination/
    
por 24.02.2015 / 03:02
1

A maneira mais simples seria usar o intervalo numérico de zsh glob :

mv PRC<257-1516> /else/where/

O operador de intervalo corresponde a números com ou sem zeros à esquerda, então PRC257 , PRC0257 , PRC00257 , etc. estão todos incluídos. Você pode deixar o final do intervalo em branco, por exemplo PRC<257-> para mover todos os arquivos de 257 em diante. Não importa quantos arquivos no intervalo existam. Entre os shells comuns, esse recurso existe apenas em zsh.

Intervalos de suporte Bash, ksh93 e zsh em chaves. Isto não é um glob, mas uma simples expansão de texto, por ex. a{9..11} se expande para a9 a10 a11 , independentemente de existir algum desses arquivos.

mv PRC{0257..1516} /else/where

Você também pode combinar vários globs; isso tem a vantagem de trabalhar em qualquer shell, mas é difícil quando seus limites não são números redondos.

mv PRC025[7-9] PRC02[6-9][0-9] PRC0[3-9][0-9][0-9] PRC1[0-4][0-9][0-9] PRC150[0-9] PRC151[0-6] /else/where

Como alternativa, você pode ser mais inclusivo no glob e no filtro.

for x in PRC[0-9]*; do
  n=${x#PRC}
  n=${x%"${x##*[!0]*}"} # strip leading zeroes (beware that numbers with a leading 0 are parsed in octal)
  if [ "$x" -ge 257 ] && [ "$x" -le 1516 ]; then mv "#x" /else/where; fi
done
    
por 25.02.2015 / 02:50