1

Итак, давайте предположим, что у меня есть:

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/ » не выполняется, так как каталог уже существует в месте назначения.

Как я могу сделать это с помощью одной команды?

4 ответа4

6

Вы можете использовать rsync.

rsync -av --remove-source-files src/ dest/

К сожалению, это не удалит каталоги все же. Вы можете просто добавить дополнительную команду, чтобы удалить их.

2

Хотя опция rsync лучше подходит для простого перемещения файлов, здесь есть другой подход; используя find для повторного вызова 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

Обратите внимание, что:

  • _find * пропустит любые файлы / каталоги, которые начинаются с точки (".").
  • это также не удалит каталоги.

Я использую что-то в этом духе, используя nightly cron, для создания миниатюр новых изображений в моем личном архиве изображений, затем использую rsync для создания резервной копии всех изображений на втором компьютере.

1

Это не cp -a, ключ -a - это переключатель архива.

Это должен быть cp -R, рекурсивный переключатель.

Вы также можете добавить ключ -f для принудительной перезаписи.

0

Насколько я знаю, рекурсивный mv не представляется возможным. Я бы предложил выполнить cp -R последующим rm -r .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .