Copie um intervalo de arquivos na linha de comando (ZSH / BASH)

9

Eu tenho uma lista de arquivos com números consecutivos como sufixos. Eu gostaria de copiar apenas um intervalo desses arquivos. Como posso especificar um intervalo como parte do meu comando cp.

$ls
P1080272.JPG* P1080273.JPG* P1080274.JPG* P1080275.JPG* P1080276.JPG* P1080277.JPG*
P1080278.JPG* P1080279.JPG* P1080280.JPG* P1080281.JPG* P1080282.JPG* P1080283.JPG*

Eu gostaria de copiar arquivos de P1080275.JPG para P1080283.JPG com algo semelhante a:

$cp P10802[75-83].JPG ~/Images/.

Existe uma maneira de fazer isso?

    
por Amjith 16.03.2012 / 12:09

4 respostas

16

Você estava muito perto. Sua pergunta foi quase a sintaxe correta:

cp P10802{75..83}.JPG ~/Images
    
por 16.03.2012 / 14:34
8

Para iterar em um intervalo no bash:

for x in {0..10}; do echo $x; done

Aplicando o mesmo no seu caso:

for x in {272..283}; do cp P1080$x.JPG ~/Images; done
    
por 16.03.2012 / 12:18
4

Zsh, com a opção extendedglob tem o operador globbing (correspondência de padrões).

setopt extendedglob
echo P10802<75-83>.JPG

irá corresponder nomes de arquivos no diretório atual que correspondem a esse padrão (cuidado com o fato de que P1080275.JPG corresponde, mas o mesmo acontece com P108020000000075.JPG)

Na outra extremidade, o operador de expansão de cadeia {x ... y} (suportado por zsh e versões recentes de bash e ksh93), expande para as cadeias de x para y, independentemente de quais arquivos existem na cadeia atual. diretório.

cp P10802<75-83>.JPG ~there

copiará os arquivos correspondentes, então

cp P10802{75..83}.JPG ~there

Mas você receberá erros se, por exemplo, o P1080281.JPG não existir.

    
por 25.08.2012 / 21:40
1

Isso funcionaria para você:

for each in {75..83}; do cp P10802$each.JPG ~/Images/; done
    
por 16.03.2012 / 12:15