如何判断是否从命令行将两个文件进行了硬链接?例如一些链接:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
如何判断是否从命令行将两个文件进行了硬链接?例如一些链接:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
Answers:
在大多数文件系统¹上,文件是由其索引节点号唯一地确定的,因此您需要检查的是两个文件是否具有相同的索引节点号并且在同一文件系统上。
Ash,ksh,bash和zsh具有可为您进行检查的结构:文件相等运算符-ef
。
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
对于更高级的情况,请ls -i /path/to/file
列出文件的索引节点号。df -P /path/to/file
显示文件所在的文件系统(如果两个文件在同一目录中,则它们在同一文件系统上)。如果您的系统具有该stat
命令,则它可能会显示inode和文件系统编号(stat
因系统而异,请查看文档)。如果您想快速浏览目录中的硬链接,请尝试ls -i | sort
(可能通过管道传输到awk)。
¹ 所有本机unix文件系统,以及其他一些文件系统(例如NTFS),但可能不是特殊情况(例如CramFS)。
fileA -ef fileB
还返回0
(成功)。fileA
fileB
[ .bashrc -ef .bash/.bashrc ]
是正确的。当然,没有上下文,我也不知道为什么它“没有真正起作用”-您可能在比较错误的文件,可能无法正确检查结果,可能使用的外壳程序不带-ef
... ...
[
是的同义词test
。但是man [
或man test
会给您提供外部命令的手册页,而几乎每个外壳程序都有一个内置的命令,带有稍微不同的选项,因此您需要在外壳程序手册中查找该命令。
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
stat -c %d
)。而且,如果您使用的是Linux(根据stat
命令),则您的Shell可以[ fileA -ef fileB ]
直接执行所有这些操作。另外,您的命令无意间打乱了包含空格或的文件名\[?*
,或者以-
:开头:总是在命令符号("$(stat -c %i -- "$1")"
)前后加上双引号。
function
使用功能名称(由于包含破折号)而违反了所允许名称的POSIX约定的,绝对不可移植的关键字?
$1
和$2
。您可能还希望使用$()
语法而不是反引号,因为方括号使该命令在何处开始,在何处结束以及嵌套更加简单。
正如第一个发布者所建议的那样,您可以在Linux上基于以下内容编写脚本:
stat -c '%i' fileA fileB fileC
stat -c %d
)。而且,如果您使用的是Linux(根据stat
命令),则您的Shell可以[ fileA -ef fileB ]
直接执行所有这些操作。