2015-04-28 4 views
3

Есть ли способ проверить, находятся ли два файла на одном томе в bash на Mac OS X? Или, что то же самое, чтобы проверить, находится ли данный файл на загрузочном томе?Проверьте, находятся ли два файла на одном томе в bash

Я пробовал использовать ln и проверял, не сработает ли он, но иногда ln не удается выполнить другие причины, кроме ошибки cross-device link.

Я также попытался использовать функцию, которая печатает путь к файлу, а затем проверяет, содержит ли этот путь /Volumes/ в качестве префикса, но не все мои удаленные тома подключаются к /Volumes/.

Есть ли другой способ?

+1

Вы можете разобрать/сравнить результаты 'df': http://unix.stackexchange.com/questions/11311/how-do-i-find-on-which -физическое-устройство-a-folder-is находится –

+0

@ Politank-Z Мне лучше проверить, есть ли файловая система/dev/disk1 или точка монтирования /? –

+0

Вы спрашиваете, находятся ли два файла на одном томе. Я думаю, что файловая система лучше сравнивать. –

ответ

7

Вы спрашиваете, находятся ли два файла в одной файловой системе. Канонический способ проверки этого состоит в том, чтобы вызвать системный вызов stat() по двум файлам и проверить, имеют ли они то же значение st_dev, где st_dev идентифицирует устройство, на котором находится файл.

Вы можете использовать команду 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

Смежные вопросы