O primeiro passo seria copiar a estrutura do diretório:
sdir="/path/to/source/dir"
tdir="/path/to/target/dir"
cd "$sdir"
find . -type d -exec mkdir -p "$tdir"/{} \;
Pode haver mais coisas que você deseja fazer, por exemplo copiar permissões:
find . -type d -exec chmod --reference={} "$tdir"/{} \;
(Nota: --reference
não é exigido pelo POSIX).
Ou, em vez de mkdir
, você pode usar cp -a --attributes-only
(também não POSIX):
# this assumes $tdir doesn't yet exist but its future parent does
cp -a "$sdir" "$tdir"
remova todos os não diretórios de $tdir
, deixando a estrutura de diretórios vazia:
# make sure "$tdir" is what it should be
find "$tdir" ! -type d -delete
Agora, quando você tiver a estrutura de diretório de destino, trabalhe com os arquivos. Se você não precisa de pipes, redirecionamentos, etc., esta abordagem de exemplo serve:
cd "$sdir"
find . -type f -exec ffmpeg -i {} -c:v libx264 -crf 23 -c:a copy "$tdir"/{} \;
# source ^^ target ^^^^^^^^^^
Se você precisar de canos ou redirecionamentos, precisará de um shell para lidar com eles:
cd "$sdir"
find . -type f -exec sh -c 'head -n 10 "$1" >"$2"/"$1"' sh-find {} "$tdir" \;
# for sh these are $0:^^^^^^^, $1:^^, $2:^^^^^
A execução de um shell separado para cada arquivo é lenta, mas permite que você faça praticamente qualquer coisa.