Solução muito mais limpa, baseada em uma resposta vinculada por @don_crissti. ( Filtro Rsync: copiando somente um padrão )
rsync -av --remove-source-files --include='*[0-9][0-9][0-9]' --include='*/' --exclude '*' /tmp/oldstruct/ /tmp/newstruct/
E a negação:
rsync -av --remove-source-files --exclude='*[0-9][0-9][0-9]' /tmp/oldstruct /tmp/newstruct/
Resposta original:
Isso deve ser feito. Ele encontrará qualquer arquivo na estrutura que você cd
terminar em 3 dígitos, criará uma pasta de destino no /tmp/newstruct
e moverá o arquivo.
cd /tmp/oldstruct
find ./ -type f -regextype posix-basic -regex '.*[0-9]\{3\}' |
while read i; do
dest=/tmp/newstruct/$(dirname $i)
mkdir -vp $dest
mv -v $i $dest
done
Eu recomendaria que você prefixe o mkdir
e o mv
com echo
antes de executá-lo, apenas para garantir que ele faça o que você espera.
Para negar os 3 dígitos, basta colocar ! -regex
.
Aqui está um método mais simples que depende do rsync. No entanto, ele chama rsync
para cada arquivo que encontrar, então definitivamente não é muito eficiente.
find ./ -type f -regextype posix-basic -regex '.*[0-9]\{3\}' --exec rsync -av --remove-source-files --relative {} /tmp/newstruct