A maneira mais fácil é com zsh . Você pode usar qualificadores de glob para corresponder arquivos de acordo com critérios como seu tipo e tamanho. O padrão curinga **/
corresponde a qualquer nível de subdiretórios. Os modificadores de histórico h
e t
são formas fáceis de extrair o diretório e a base parte de um nome de arquivo. Chame mkdir -p
para criar os diretórios quando necessário.
cd dirA
for x in **/*(.Lm+300); do
mkdir -p ../dirB/$x:h &&
mv -- $x ../dirB/$x
done
A maneira portátil é com find
. Use -exec
para invocar um snippet de shell para cada arquivo.
cd dirA
find . -type f -size +300000k -exec sh -c 'for x do
mkdir -p "../dirB/${x%/*}"
mv "$x" "../dirB/$x"
done' sh {} +
A paralelização raramente é útil para entrada / saída: ela permite que você aproveite várias CPUs, mas a CPU raramente é um gargalo na E / S.