Движущиеся файлы на Linux, добавляя существующие каталоги в месте назначения

Поэтому давайте предположим, что я имею:

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

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

1
задан 07.09.2009, 15:44

4 ответа

Можно использовать rsync.

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

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

6
ответ дан 12.12.2019, 07:49
  • 1
    Странный, что нет никакой опции удалить каталоги. Это очень близко к намерению, так или иначе, так принято. Существует ли команда к каждому пустому каталогу в дереве каталогов (эффективно удаляющий полное дерево, если это пусто)? – Ilari Kajaste 08.09.2009, 19:53
  • 2
    я предполагаю Вас, мог сделать, находят. - тип d - пустой - должностное лицо rmdir {} \; – Dan Gravell 09.09.2009, 12:55

Это не CP-a, переключатель-a является переключателем архива.

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

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

1
ответ дан 12.12.2019, 07:49
  • 1
    Да, но перемещение действительно сохраняет принадлежности файла и метки времени, как-a делает, в то время как-R не делает. Таким образом-a является лучшей аналогией для перемещения. – Ilari Kajaste 08.09.2009, 19:30

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

0
ответ дан 12.12.2019, 07:49
  • 1
    Однако при перемещении дерева каталогов от одного объема до другого, не делает mv, на самом деле выполняют рекурсивное перемещение? – Ilari Kajaste 08.09.2009, 19:41
  • 2
    К сожалению, нет. То, когда mv воздействует на различные объемы, он на самом деле выполняет CP, сопровождаемое комнатой – mouviciel 08.09.2009, 21:58

В то время как 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

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

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

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

2
ответ дан 12.12.2019, 07:49

Теги

Похожие вопросы