Как узнать, находится ли файл в удаленной файловой системе с помощью Perl?

Есть ли быстрый и грязный способ сказать программно, в сценарии оболочки или в Perl, находится ли путь в удаленной файловой системе (nfs или тому подобное) или в локальной? Или это единственный способ сделать это, чтобы разобрать /etc/fstab и проверить тип файловой системы?


person Alex    schedule 17.11.2008    source источник


Ответы (5)


stat -f -c %T <filename> должен делать то, что вы хотите. Вам также может понадобиться -l

person Chris Dodd    schedule 17.11.2008
comment
Опять же, не портируется на Solaris (хотя у меня есть команда на машине, это не стандартная проблема). - person Jonathan Leffler; 17.11.2008

Вы можете использовать «df -T», чтобы получить тип файловой системы для каталога, или использовать параметр -t, чтобы ограничить отчеты определенными типами (например, nfs), и если он вернется с «файловые системы не обработаны», то это не один из тех, кого вы ищете.

df -T $dir | tail -1 | awk '{print $2;}'
person Steve Baker    schedule 17.11.2008
comment
Не переносимый - например, 'df -T' не работает в Solaris. - person Jonathan Leffler; 17.11.2008
comment
Если все сетевые файловые системы используют семантику host:path для имени устройства, то я полагаю, вы можете проверить наличие : в имени устройства или что-то в этом роде. - person Steve Baker; 17.11.2008

Если вы используете df в каталоге, чтобы получить информацию только об устройстве, в котором он находится, например. для текущего каталога:

df .

Затем вы можете просто проанализировать вывод, например.

df . | tail -1 | awk '{print $1}'

чтобы получить имя устройства.

person Svante    schedule 17.11.2008

Я протестировал следующие устройства на Solaris7,8,9 и 10, и они кажутся надежными.

/bin/df -g <filename> | tail -2 | head -1 | awk '{print $1}'

Должен дать вам тип fs, а не пытаться сопоставить «хост: путь» в вашей точке монтирования.

person Vagnerr    schedule 24.08.2010

В некоторых системах номер устройства для файлов NFS отрицательный. Таким образом,

print "remote" if (stat($filename))[0] < 0
person Leon Timmermans    schedule 17.11.2008