Как рекурсивно копировать каталог, используя жесткие ссылки для каждого файла

Я добавляю еще один ответ на этот вопрос, потому что в моем случае не было запущенного процесса systemd-sleep , но я не мог остановка, выключение, выключение и перезагрузка моей машины. (Я думаю, что такое поведение является еще одним доказательством того, что systemd полностью квалифицируется как вредоносное ПО , но давайте оставим это обсуждение на другой раз.)

В конце концов, я обратился к Ядро за помощь в борьбе с systemd . Следующее не сильно отличается от аппаратной перезагрузки (нажатие кнопки питания), но может помочь, если у вас нет физического доступа к машине:

echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger

После перезагрузки выполните уничтожение порождения ада.

55
22.07.2017, 21:54
2 ответа

@gudmundur -Орн ответил правильно, но если вы используете BtrFS в Linux, то cp a --reflink=auto dirA dirBдолжно помочь, с той разницей, что файлы на самом деле разные, и изменение одного не меняет другого. Вы можете добиться в основном того же с cp -cна Mac с APFS(autoсделает полную копию, если это невозможно, -cне удастся ).

Любая файловая система COW должна это делать, но поставщики не согласовали стандартную опцию командной строки.

1
27.01.2020, 19:33

rsync -av --link-dest="$PWD/dirA" dirA/ dirB

Если у вас уже установлено rsync, это простая и быстрая команда. Чтобы справиться с символическими ссылками, вы можете выбрать между --links, --copy-links, --copy-unsafe-linksили--safe-links

На справочной странице rsync:

--link-dest=DIR         hardlink to files in DIR when unchanged
 -l, --links                 copy symlinks as symlinks
 -L, --copy-links            transform symlink into referent file/dir
--copy-unsafe-links     only "unsafe" symlinks are transformed
--safe-links            ignore symlinks that point outside the tree

Редактировать:

  • Исправлена ​​команда после комментария @MichaelR. Спасибо!
  • Протестировано следующим образом в MacOS с использованием rsync 2.6.9
$ cd /tmp && rm -rf a b; mkdir a && touch a/c && echo "xxx" > a/c && rsync -av --link-dest="$PWD/a" a/ b; 
$ ls -lR a b
building file list... done
created directory b
./

sent 74 bytes  received 26 bytes  200.00 bytes/sec
total size is 4  speedup is 0.04
a:
total 8
-rw-r--r--  2 user  wheel  4 Aug 26 16:09 c

b:
total 8
-rw-r--r--  2 user  wheel  4 Aug 26 16:09 c
2
05.02.2021, 19:21

Теги

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