find /volume1/photoTest -type d -name eaDir_tmp -prune \ -exec sh -c 'rsync -a "$1"/ "${1%/*}/@eaDir"' sh {} ';' \ -o -type d -name @eaDir -prune
Это будет искать все каталоги, имя которых
eaDir_tmp
в или ниже/volume1/photoTest
. Для каждого такого каталога будет выполняться следующая команда:rsync -a "$1"/ "${1%/*}/@eaDir"
где
$1
— путь к найденному каталогу. Подстановка параметра${1%/*}
удалит последний компонент имени пути, превратив, например,./volume1/photoTest/folderA/eaDir_tmp
в/volume1/photoTest/folderA
(, вы также можете использовать"$( dirname "$1" )"
).Мы удаляем все найденные каталоги
eaDir_tmp
и@eaDir
из списка поиска, когда находим их, не позволяяfind
войти в них. Это делается с помощью-prune
.С
find
, принимающим-execdir
:find /volume1/photoTest -type d -name eaDir_tmp -prune \ -execdir rsync -a eaDir_tmp/ @eaDir ';' \ -o -type d -name @eaDir -prune
Связанные:
Использованиеzsh
:
for dirpath in /volume1/photoTest/*/eaDir_tmp(/DN); do
rsync -a "$dirpath"/ "$dirpath:h/@eaDir"
done
Использованиеbash
:
shopt -s dotglob nullglob
for dirpath in /volume1/photoTest/*/eaDir_tmp/; do
rsync -a "$dirpath"/ "$(dirname "$dirpath")/@eaDir"
done