Поэтому давайте предположим, что я имею:
dest/dir/file1
dest/dir/file2
dest/dir/subdir/subfile1
dest/dir/subdir/subfile2
и
src/dir/file3
src/dir/subdir/subfile3
src/dir/newdir/anotherfile
... и давайте предположим, что существуют тысячи файлов и подкаталогов.
Теперь я хочу переместить все новые файлы от src до dest, к их соответствующим каталогам, создавая новые подкаталоги при необходимости. Это было бы эквивалентом "CP-a src/dir dest /", но как операция пересылки. Очевидная команда "mv src/dir dest /" сбои как каталог уже существует в месте назначения.
Как я могу сделать это с одной командой?
Можно использовать rsync.
rsync -av --remove-source-files src/ dest/
К сожалению, это не удалит каталоги все же. Вы могли просто добавить дальнейшую команду для удаления их.
Это не CP-a, переключатель-a является переключателем архива.
Это должно быть CP-R, рекурсивный переключатель.
Можно также добавить, что-f переключаются для принуждения перезаписи.
Насколько я знаю рекурсивное mv
не возможно. Я предложил бы выполнить a cp -R
сопровождаемый a rm -r
.
В то время как rsync вариант лучше для просто движущихся файлов, вот другой подход; использование находит для повторного вызова mv:
# First, move directories that don't exist on the destination:
(cd src/dir ; find * -type d -print) | while read f; do
[ ! -d "src/dir/$f" ] || [ -d "dest/dir/$f" ] || mv "src/dir/$f" "dest/dir/$f"
done
# Then move individual files:
(cd src/dir ; find * -type f -print0) | xargs -0 -n1 -i@ /bin/mv src/dir/@ dest/dir/@
# Alternate to the xargs usage, to allow prompting before overwriting files:
(cd src/dir ; find * -type f) | while read f; do
/bin/mv -i "src/dir/$f" "dest/dir/$f" </dev/tty
done
Обратите внимание что:
Я использую что-то вдоль этих строк, ночным кроном, для создания любых миниатюр новых изображений в моем персональном архиве изображений, затем использую rsync для создания резервного копирования всех изображений на 2-й машине.