我问这个问题的动机如下,创建符号链接的一个目的是节省空间,但是将目录移动到其他位置的简单 mv 命令会将所有内容移动到目标位置,将符号链接视为完整文件。当我备份文件时,这可能会占用非常大但不必要的空间。我的问题是,有没有办法只移动真实文件,但保留符号链接不变?
答案1
你可以使用rsync
rsync -l original_file backup_file
从man rsync
-l, --links 将符号链接复制为符号链接
即,您仅复制链接,而不复制其指向的内容。请注意,这不是移动,而是复制,但我认为这就是您备份的意思。
答案2
您可以使用 shell 测试运算符-L
来测试文件是否是符号链接。如果您正在使用诸如mv *.txt elsewhere/
移动文件之类的东西,那么您可以使用循环跳过符号链接:
for x in *.txt; do
if ! [ -L "$x" ]; then mv -- "$x" elsewhere/; fi
done
或者,您可以find
根据文件的类型调用以对其进行操作。当您递归地遍历目录时,这非常有用。请注意,当您将目录传递给 时mv
,它会移动整个目录,这会间接影响下面的所有文件。
我不明白这与备份中“巨大但不必要的空间”有什么关系。该线程可能与您的实际问题无关。
答案3
而不是制作符号链接你(们)能做到硬链接因此,如果您将原始文件移至其他位置或将其删除,硬链接仍然有效。但也有一些局限性,例如它仅限于文件,因此不能指向目录。其次,只能在同一文件系统中包含的文件之间创建链接。
无论如何,如果你选择使用符号链接移动源文件后,您应该再次提供链接的完整路径,因为它只是指向另一个文件名的指针。