Macos 在bash中检查两个文件是否在同一个卷上

Macos 在bash中检查两个文件是否在同一个卷上,macos,bash,file,shell,Macos,Bash,File,Shell,在Mac OS X上的bash中,有没有办法检查两个文件是否在同一个卷上? 或者,等效地,检查给定文件是否在引导卷上 我曾尝试使用ln并检查它是否失败,但有时ln会因为跨设备链接错误以外的原因失败 我还尝试使用一个打印文件路径的函数,然后检查该路径是否包含/Volumes/作为前缀,但并不是所有远程卷都装载到/Volumes/ 还有其他方法吗?您正在询问两个文件是否在同一个文件系统上。检查这一点的标准方法是对两个文件调用stat()系统调用,并检查它们是否具有相同的st_dev值,其中st_de

在Mac OS X上的bash中,有没有办法检查两个文件是否在同一个卷上? 或者,等效地,检查给定文件是否在引导卷上

我曾尝试使用
ln
并检查它是否失败,但有时
ln
会因为
跨设备链接
错误以外的原因失败

我还尝试使用一个打印文件路径的函数,然后检查该路径是否包含
/Volumes/
作为前缀,但并不是所有远程卷都装载到
/Volumes/


还有其他方法吗?

您正在询问两个文件是否在同一个文件系统上。检查这一点的标准方法是对两个文件调用
stat()
系统调用,并检查它们是否具有相同的
st_dev
值,其中
st_dev
标识文件所在的设备

您可以使用bash中的
stat
命令执行此测试:

device=$(stat -f '%d' /path/to/file)
因此,要检查两个文件是否在同一个文件系统上:

dev1=$(stat -f '%d' /path/to/file1)
dev2=$(stat -f '%d' /path/to/file2)

if [ "$dev1" = "$dev2" ]; then
    echo "file1 and file2 are on the same filesystem"
fi
上述工作在OSX下进行;同样的检查可以在Linux上执行,但是
stat
命令需要
-c
-format
而不是
-f
df

f1="$(df -P /path/to/file1.txt | awk 'NR!=1 {print $1}')"
f2="$(df -P /path/to/file2.txt | awk 'NR!=1 {print $1}')"

if [[ "$f1" = "$f2" ]]; then
  echo "same filesystem"
else
  echo "different filesystem"
fi

您可以分析/比较df的结果:@Politank-Z我最好检查文件系统是/dev/disk1还是挂载点是/?您正在询问两个文件是否在同一卷上。我认为文件系统是比较好的比较点。Linux在这个问题中的作用在哪里?或者这是一个随机/不正确的标记?@ghoti不正确的标记,对不起,请小心带有空格的卷。如果您正在查看的文件位于
/Volumes/Big USB stick/file1.txt
之类的位置,则此操作可能会失败。如果在变量中找到
file1
file2
,则必须引用变量,以避免文件名中出现特殊字符的问题。回答得很好--+1!这是可行的,但我更喜欢df解决方案,因为df的输出是可读的。谢谢,不管你的船怎么漂,我想。如果您正在编写一个脚本——我认为——您需要一些更易于机器解析的东西,而不需要通过awk或其他工具进行后处理。