Dado o grande número de arquivos no diretório de origem, a solução proposta provavelmente levará alguns minutos.
Se você não quiser esperar, convém considerar uma solução que não gera um processo para cada movimento.
Para processar em lote, você pode utilizar o fato de que cpio
com --pass-through
e --link
se comporta como um movimento - a origem e o destino estão no mesmo sistema de arquivos, a operação será rápida, caso contrário, uma cópia inteira será feita.
Ao contrário de mv
, cpio -lpd
deixará um hardlink para cada arquivo de origem, mas eles serão fáceis de remover en-mass com rm -r
depois se a operação for um sucesso:
A implementação do divisor de diretório pode ser algo como:
split_dir()(
local src=$1 nbatches=$2 dest=$3
local tmpd=
trap 'rm -rf "$tmpd"' EXIT
tmpd="$(mktemp -d "$tmpd")"
find -type f "$src" > "$tmpd/files"
local nfiles=$(wc -l < "$tmpd/files")
local batchsz=$((nfiles/nbatches))
( cd "$tmpd"; split -l "$batchsz" -d files )
local i
for((i=0;i<nbatches;i++)); do
mkdir -p "$dest/$i"
< x$i cpio -pdl "$dest/$i"
done
)