Você pode tentar isso. Você precisa de caminhos absolutos para os dois argumentos requeridos por este script.
Corra assim
copyperms.sh source_dir target_dir
Aqui está o script: cat copyperms.sh
#!/bin/bash
srcDir="$1"
targDir="$2"
if [ -z "$srcDir" ] || [ -z "$targDir" ]; then
echo "Required argument missing."
elif [ ! -d "$srcDir" ] || [ ! -d "$targDir" ] ; then
echo "Source and target not both directories."
exit
else
cd $srcDir
echo "Source directory: $srcDir; Target directory: $targDir"
echo "Matching permissions and ownerships .."
find . -print0 | xargs -0I {} echo {} | xargs -I {} chmod --reference "{}" "$targDir/{}"
find . -print0 | xargs -0I {} echo {} | xargs -I {} chown --reference "{}" "$targDir/{}"
# find . | while read name
# do
# chmod --reference "$name" "$targDir/$name"
# chown --reference "$name" "$targDir/$name"
# done
echo ".. done!"
fi
É possível adaptar-se a mais utilizações ao utilizar o loop while com comentários, mas é mais lento.
$ time mperms / adp / código / adp / safe / code
Usando xargs:
real 0m0.107s
usuário 0m0.008s
sys 0m0.004s
Usando loop while:
real 0m0.234s
usuário 0m0.012s
sys 0m0.028s
sys 0m0.028s