В общей современной среде Unix (скажем, GNU / Linux, GNU / Solaris или Mac OS X) существует ли хороший способ определить, к какой точке монтирования и типу файловой системы относится конкретный абсолютный путь к файлу?
Я полагаю, что мог бы выполнить mount
команду и вручную проанализировать вывод этой строки и сравнить ее со строкой моего пути к файлу, но прежде чем я это сделаю, мне интересно, есть ли более элегантный способ.
Я разрабатываю сценарий BASH, который использует расширенные атрибуты, и хочу, чтобы он делал все правильно (в малой степени, насколько это возможно) для различных файловых систем и хост-сред.
источник
df -P
должен производить стандартизированный вывод в любой POSIX-совместимой системе. В некоторых глупых системах может потребоваться установка магической переменной среды, такой как POSIXLY_CORRECT.df /path-to-the-directory
даст вам содержащий раздел этого каталогаВы можете использовать стат . Команда stat --printf '% d' filename.txt вернет номер устройства в шестнадцатеричном / десятичном виде.
источник
stat --printf "%d"
действительно говорит вам младший номер устройства, но еще предстоит проделать дополнительную работу, чтобы получить имя устройства и его смонтированную файловую систему.stat --format '%m' $file
даст вам точку монтирования иstat --file-system --format '%T' $mount
предоставит имя типа файловой системы.Для конкретного файла это так же просто, как
источник
Гектометр Для точки монтирования вы можете идти вверх по иерархии, пока не изменится st_dev (тогда вы только что пересекли границу монтирования); есть GNU
stat
для скриптов bash; Тем не менее, я не знаю, как вы можете угадать тип файловой системы без разбора/proc/mounts
или методом проб и ошибок (т.е. обрабатывать сбои после установки расширенных атрибутов)источник
Одна проблема с использованием
df
заключается в том, что если имя устройства в выводе длинное, строка будет перенесена, поэтому вы не сможете просто взять последнюю строку. Вместо этого удалите первую строку, а затем возьмите новую первую строку и напечатайте первое поле:источник
Кажется, в Linux есть проблема с df и btrfs. Когда вы просите df определить точку монтирования для смонтированного тома btrfs, это будет правильно. В этом случае joe является подкаталогом / m / whale / backup.
Но если каталог, на который ссылаются, является вложенным томом, он больше не сообщит вам точку монтирования.
/ A / whale / backup - единственная точка монтирования в соответствии с ядром.
FWIW, stat делает то же самое:
источник
С /programming/2167558/give-the-mount-point-of-a-path :
работает везде, где я тестировал, как для * BSD, так и для sysV, а также для дурацких автоматически монтируемых каталогов. Я был бы рад услышать о случае, когда это терпит неудачу.
источник
os.path.splitunc()
работает только для путей UNC и доступно только в Windows .