Слишком много копий папок и файлов

Я думаю, что все знакомы с этим сценарием:

find /dir1/dir2/dir3/dir4/* -mtime +5 -exec cp -rf {} /dirA/dirB/dirC/ \;

Моя проблема в том, что я хочу, чтобы содержимое dir4 старше 5 дней, которое будет содержать больше подкаталогов и их содержимое, было скопировано в dirC с неповрежденной структурой каталогов. Пока звучит хорошо, и этот сценарий должен делать то, что я думал.

Но он не делает то, что я думал, что должен. Вместо этого он начинается в dir1, детализируется до самой нижней папки и начинает копирование, затем поднимается и начинается снова в dir4, и так далее, и так далее. Конечный результат - все в структуре папок копируется несколько раз.

Я пробовал rsync, cpio и pax вместо cp, а также с теми же результатами, независимо от того, выполняю ли я rsync -r или cpio -r или pax -r. Все они начинают копировать каждую часть пути к каталогу.

Есть идеи?

1 ответ

У вас есть две проблемы:

  1. Вы пытаетесь рекурсивно скопировать рекурсивный список (двойная рекурсия), включая файлы, которые вам не нужны
  2. Вы копируете без сохранения структуры каталогов по отношению к исходному базовому каталогу, тем самым получая искаженное дерево

Вместо этого вы должны без рекурсивного представления рекурсивного списка файлов в соответствующие им каталоги. Вы можете сделать это с rsync"s --files-from и процесс замены:

rsync --from0 --files-from <(find ./src -mtime +5 -print0) \
  ./  ./target

В качестве альтернативы, через cpio:

find src/ -mtime +5 -print0 | cpio -0 -o | { cd target && cpio -i; }
Другие вопросы по тегам