Sim, essa sintaxe não é POSIX. Somente um {}
(em seu próprio argumento) autônomo tem a garantia de ser expandido.
Uso:
find src_dir -type d -exec sh -c 'for dir do
mkdir -p "dst_dir/$dir"; done' sh {} +
Ou para evitar a execução de um mkdir
por diretório:
find src_dir -type d -exec sh -c 'for dir do
set -- "$@" "dst_dir/$dir"; shift; done
mkdir -p "$@"' sh {} +
(embora exista o risco de atingir a condição "lista de argumentos muito grande").
Observe que isso criaria dst_dir/src_dir/x/y...
. Se você quisesse dst_dir/x/y...
, você faria:
find src_dir -type d -exec sh -c 'for dir do
set -- "$@" "dst_dir${dir#src_dir}"; shift; done
mkdir -p "$@"' sh {} +
Outra opção, se você pode garantir que os caminhos de diretório não contenham caracteres de nova linha, seria usar pax
:
find src_dir -type d | pax -rw dst_dir
Isso permitiria que você também copiasse os metadados dos diretórios, como propriedade e permissões (com -pe
)
Para remover o componente principal src_dir
no destino:
find src_dir -path '*/*' -type d | pax -'s@^src_dir/@@' -rw dst_dir
Ou:
(cd src_dir && find . -type d | pax -rw ../dst_dir)