| é o operador de pipeline.
cp -r ~/copyDest/*2[0-9]|3[0-2]* ~/pasteDest
é o comando cp canalizado para o comando cujo nome é o primeiro arquivo expandido do 3[0-2]* glob. Para | ser um operador de alternação glob, ele deve estar em (...) em zsh (mas zsh tem um operador dedicado para correspondência de intervalo de número) e @(...) em ksh (ou bash com extglob on).
Então, com zsh :
cp -r ~/copyDest/(*[^0-9]|)<20-32>(|[^0-9]*) ~/pasteDest
Sem o (*[^0-9]|) , também corresponderia a foo120
Com ksh ou bash -O extglob (ou use shopt -s extglob dentro de bash ) ou zsh -o kshglob ( set -o kshglob dentro de zsh ), o equivalente (exceto na ordem em que os arquivos são copiados) ficaria assim:
(
LC_ALL=C
cp -r ~/copyDest/?(*[^0-9])*(0)@(2[0-9]|3[0-2])?([^0-9]*) ~/pasteDest
)
Com ksh ou bash, na maioria dos sistemas e na maioria das localidades diferentes de C, [0-9] combina muito mais caracteres que 0123456789, portanto, o LC_ALL=C (que também afeta a ordem de classificação da expansão glob). Se os seus nomes de arquivo contiverem apenas caracteres ASCII, você poderá omiti-lo, pois não acredito que nenhum código de idioma em qualquer sistema sã teria caracteres ASCII diferentes de 0123456789 correspondido por [0-9] . Outra alternativa é substituir [0-9] por [0123456789] .
Observe também que, exceto em zsh -o kshglob , se o padrão não corresponder a nenhum arquivo, cp será chamado com um argumento literal .../?(*[^0-9])*(0)@(2[0-9]|3[0-2])?([^0-9]*) (um nome de arquivo válido, porém improvável) que, se existir, será copiado (ou cp retornaria um erro de outra forma). Em bash , você pode usar a opção failglob para obter um comportamento mais próximo do mais básico de zsh (de cancelar o comando se o padrão não corresponder).
Acima, tomamos um cuidado especial ao copiar arquivos chamados foo20.txt , foo00020.txt , mas não foo120.txt ou foo200.txt (mesmo que o nome deles contenha 20). Ainda copia foo32.12.txt ou foo-1E-20.txt ou foo0x20.txt arquivos.
Se você ainda quiser copiar arquivos foo120 ou foo200 , isso se tornará muito mais simples:
-
zsh:cp -r ~/copyDest/*<20-32>* ~/pasteDest -
bash -O extglobe co:cp -r ~/copyDest/*@(2[0123456789]|3[012])* ~/pasteDest