ใน * nix จะตรวจสอบว่าระบบไฟล์ใดที่ไฟล์นั้นเปิดอยู่ได้อย่างไร


12

ในสภาพแวดล้อมยูนิกซ์ทั่วไปที่ทันสมัย ​​(เช่น GNU / Linux, GNU / Solaris หรือ Mac OS X) มีวิธีที่ดีในการตรวจสอบว่าจุดเมานท์และระบบไฟล์ประเภทใดที่พา ธ ของไฟล์แน่นอนอยู่

ฉันคิดว่าฉันสามารถรันmountคำสั่งและแยกวิเคราะห์ผลลัพธ์ด้วยตนเองและเปรียบเทียบสตริงกับพา ธ ไฟล์ของฉัน แต่ก่อนที่ฉันจะทำฉันสงสัยว่ามีวิธีที่สวยงามกว่านี้หรือไม่

ฉันกำลังพัฒนาสคริปต์ BASH ที่ใช้ประโยชน์จากคุณสมบัติเพิ่มเติมและต้องการทำให้สิ่งที่ถูกต้อง (เท่าที่เป็นไปได้) สำหรับระบบไฟล์และสภาพแวดล้อมโฮสต์ที่หลากหลาย

คำตอบ:


19

คำสั่งdf(1)ใช้เวลาหนึ่งหรือมากกว่าอาร์กิวเมนต์และจะกลับจุดเชื่อมต่อและอุปกรณ์ที่ไฟล์หรือไดเรกทอรีนั้นมีอยู่เช่นเดียวกับข้อมูลการใช้งาน จากนั้นคุณสามารถใช้พา ธ หรืออุปกรณ์เพื่อค้นหาประเภทของระบบไฟล์ในผลลัพธ์mount -vหรือคล้ายกัน

น่าเสียดายที่รูปแบบผลลัพธ์ของทั้งสองdfและmountขึ้นอยู่กับระบบ ไม่มีมาตรฐานที่ชัดเจนอย่างน้อยที่สุดฉันสามารถดูระหว่าง Solaris, NetBSD และ Mac OS X


1
df -Pควรสร้างเอาต์พุตมาตรฐานบนระบบที่สอดคล้องกับ POSIX ระบบ Goofier บางระบบอาจต้องการตัวแปรสภาพแวดล้อมเวทย์มนตร์เช่น POSIXLY_CORRECT ที่จะตั้งค่าเช่นกัน
Dan Moulding

ตัวอย่างdf /path-to-the-directoryจะให้พาร์ทิชันที่มีไดเรกทอรีนั้นให้คุณ
Hasanuzzaman Sattar

7

คุณสามารถใช้สถิติ สถิติคำสั่ง - printf '% d' filename.txtจะส่งกลับหมายเลขอุปกรณ์เป็นเลขฐานสิบหก / ทศนิยม


ดังนั้นจะหาชื่ออุปกรณ์พื้นฐานได้อย่างไร?
เดซี่

คุณต้องดำเนินการแม้ว่าไฟล์อุปกรณ์ทั้งหมดใน / dev / และค้นหาหนึ่งไฟล์ด้วยหมายเลขรองเดียวกับสถิติที่รายงาน
Wiesław Herr

stat --printf "%d"ช่วยบอกคุณถึงจำนวนอุปกรณ์เล็กน้อย แต่มีงานที่ต้องทำอีกมากเพื่อให้ได้ชื่ออุปกรณ์และระบบไฟล์ที่เมาท์
Craig McQueen

2
อาจเป็นส่วนเสริมล่าสุด แต่stat --format '%m' $fileจะให้จุดเมานท์แก่คุณและstat --file-system --format '%T' $mountจะให้ชื่อประเภทระบบไฟล์
roaima

1
@ TomHale: จำไม่ได้ว่าจะซื่อสัตย์ แต่ฉันจำได้ว่ามันไม่ทำงาน เป็นที่ยอมรับฉันควรระบุ distro, kernel รุ่นอื่น ๆ แต่คุณระบุว่ามันใช้งานได้อาจหมายถึงว่ามันได้รับการแก้ไขในขณะเดียวกัน หากผลสุทธิคือมันใช้งานได้ดี :)
0xC0000022L


2

ฮึ่ม สำหรับจุดเมานท์คุณสามารถขึ้นไปตามลำดับชั้นจนกระทั่ง st_dev เปลี่ยนแปลง (จากนั้นคุณเพิ่งข้ามผ่านขอบเขตเมานท์); มี GNU statสำหรับสคริปต์ทุบตี; อย่างไรก็ตามฉันไม่รู้ว่าคุณสามารถเดาประเภทของระบบไฟล์ได้อย่างไรโดยไม่ต้องแยกวิเคราะห์/proc/mountsหรือทดลองใช้และข้อผิดพลาด (เช่นจัดการกับความล้มเหลวหลังจากตั้งค่าคุณสมบัติเพิ่มเติม)


2

gotcha หนึ่งตัวที่ใช้dfคือถ้าชื่ออุปกรณ์ในเอาต์พุตยาวมันจะเป็นบรรทัดดังนั้นคุณจึงไม่สามารถคว้าบรรทัดสุดท้ายได้ ถอดสายแรกออกแล้วดึงบรรทัดแรกใหม่แล้วพิมพ์เขตข้อมูลแรก:

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir

3
หลีกเลี่ยง gotcha นี้โดยใช้ 'df -P' เพื่อรับเอาต์พุตในรูปแบบ POSIX และไม่มีการแบ่งบรรทัด
MikeyB

2

ดูเหมือนว่าจะมีการจับกับ df และ btrfs บน Linux เมื่อคุณขอให้ df ค้นหาตำแหน่งเมานต์สำหรับวอลลุ่ม btrfs ที่ติดตั้งไว้มันจะทำสิ่งที่ถูกต้อง ในกรณีนี้ joe เป็นไดเรกทอรีย่อยของ / m / whale / backup

# df /srv/backup/joe
Filesystem      1K-blocks      Used  Available Use% Mounted on
/dev/md126     2930135488 307676684 2619663252  11% /m/whale/backup

แต่ถ้าไดเรกทอรีที่อ้างอิงนั้นเป็นวอลลุ่มย่อยมันจะไม่บอกคุณถึงจุดเชื่อมต่ออีกต่อไป

# df /srv/backup/joe/code
Filesystem      1K-blocks      Used  Available Use% Mounted on
-              2930135488 307676684 2619663252  11% /a/whale/backup/joe/code

/ a / whale / backup เป็นจุดเชื่อมต่อเดียวตามเคอร์เนล

# mount | grep whale
/dev/md126 on /a/whale/backup type btrfs (rw,relatime,space_cache)

FWIW สถิติทำสิ่งเดียวกัน:

# stat --printf '%m\n' /srv/backup/joe/code
/a/whale/backup/joe/code

1

จาก/programming/2167558/give-the-mount-point-of-a-path :

 df -P $path  | tail -1 | awk '{ print $NF}'

ทำงานได้ทุกที่ที่ฉันได้ทดสอบทั้ง * BSDs และ sysVs และสำหรับไดเรกทอรีอัตโนมัติที่แปลกประหลาด ฉันยินดีที่จะได้ยินกรณีที่มันล้มเหลว


1
รหัสแนะนำ df -P $ path | หาง -1 | awk '{print $ NF}' ล้มเหลวในทุกเวอร์ชั่นของ Solaris ที่ฉันได้ลอง (2.5.1, 8, 9 และ 10) เนื่องจาก Solaris '“ df” ไม่รองรับตัวเลือก“ -P”
Peter John Acklam

@ Peter: ฉันดีใจน้อยกว่าที่ฉันคิด แต่มันน่าสนใจที่จะรู้ว่าปัญหานั้นไม่สำคัญ ฉันคิดว่าสิ่งที่ถูกต้องคือการเขียนคำสั่งในภาษาสคริปต์ที่ห้องสมุดได้แก้ไขปัญหาอย่างถูกต้องเช่น Python มีฟังก์ชัน os.path.splitunc () ที่ให้จุดเมานท์และฉันคิดว่าทำงานบน Solaris
Charles Stewart

@CharlesStewart: น่าเสียดายที่ไม่มีฟังก์ชั่นดังกล่าวใน Python สำหรับความรู้ของฉัน os.path.splitunc()ทำงานเฉพาะสำหรับเส้นทาง UNCและเป็นที่มีเฉพาะใน Windows
Aleksi Torhamo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.