2015-04-28 52 views
3

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

我试过使用ln并检查是否失败,但有时ln由于cross-device link错误以外的原因而失败。

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

还有别的办法吗?

+1

您可以解析/'的df'比较结果:http://unix.stackexchange.com/questions/11311/how-do-i-find-on-which -physical-device-a-folder-is-located –

+0

@ Politank-Z我最好检查文件系统是/ dev/disk1还是挂载点是/? –

+0

您在质疑两个文件是否位于同一个卷上。我认为文件系统是比较好的一点。 –

回答

7

你在问两个文件是否在同一个文件系统上。检查这种情况的典型方法是调用两个文件的系统调用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 

在OS X中的上述工程;可以在Linux上执行相同的检查,但stat命令需要-c--format而不是-f

+0

我喜欢那个阿凡达! – hek2mgl

+0

不妨强调,如果在变量中找到'file1'和'file2',重要的是引用这些变量以避免文件名中的特殊字符出现问题。很好的回答 - +1! – ghoti

+0

这可行,但我更喜欢df解决方案,因为df的输出是人类可读的。谢谢 –

1

随着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 
+0

请注意带空格的卷。如果您正在查看的文件位于“/ Volumes/Big USB stick/file1.txt”之类的文件中,则可能会失败。 – ghoti

相关问题