|
é 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 extglob
e co:cp -r ~/copyDest/*@(2[0123456789]|3[012])* ~/pasteDest