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