
У меня есть каталог огромных файлов (всего ~ 1 ТБ), и я не хочу их копировать. Однако я хотел бы обойти их, поэтому было бы удобно связать их в иерархии каталогов, к которой у меня есть доступ (т. е. в той, которую я создал). Итак
/path/to/dirs/
foo
bar
baz/
tri
Необходимо скопировать в
~/path/to/dirs/
foo -> /path/to/dirs/foo
bar -> /path/to/dirs/bar
baz/
tri -> /path/to/dirs/tri
решение1
С GNU:
cd ~/path/to/dirs || exit 1
find /path/to/dirs -type d -printf %P\\0 | xargs -0 mkdir -p
find /path/to/dirs -type f -print0 |
xargs -0 cp --symbolic-link --parents --target-directory=.
решение2
С помощью GNU coreutils (т.е. на невстроенном Linux или Cygwin):
cp -al /path/to/dirs ~/path/to/dirs
Если у вас cp
нет такой -l
возможности, выполните первый проход для создания иерархии каталогов, а затем второй проход для символических ссылок:
find /path/to/dirs -type d -exec sh -c 'for x do mkdir "$HOME$x"; done' _ {} +
find /path/to/dirs ! -type d -exec sh -c 'for x do ln -s "$x" "$HOME$x"; done' _ {} +
При желании вы можете объединить два прохода в одну команду:
find /path/to/dirs -exec sh -c '
for x do
if [ -d "$x" ]; then
mkdir "$HOME$x"
else
ln -s "$x" "$HOME$x"
fi
done
' _ {} +
решение3
cp --no-dereference orig dest
Это сохранит символические ссылки при копировании. Вот документация:
-P, --no-dereference never follow symbolic links in SOURCE
-p same as --preserve=mode,ownership,timestamps