ฉันจะกำหนดประเภท fs ของไดเรกทอรีการทำงานปัจจุบันของฉันได้อย่างไร


19

ฉันต้องการวิธีตรวจจับชนิดเมานต์ของ CWD ของฉันที่ไม่ขึ้นกับแพลตฟอร์ม โดยเฉพาะฉันต้องพิจารณาว่า CWD ของฉันอยู่ในการเมานต์ที่เก็บ SSHFS, NFS, CIFS, SMB หรือบล็อกท้องถิ่น

ฉันต้องทำสิ่งนี้บน Mac OSX 10.6, 10.7 และ RHEL5 (อย่างน้อยที่สุด)

มีความเป็นไปได้ที่จะใช้ df แต่ df มีลักษณะการทำงานที่แตกต่างกันมากในสองแพลตฟอร์มนี้ นอกจากนี้ฉันต้อง CLI ขูดเอาท์พุทด้วย awk ซึ่งในขณะที่สามารถทำงานได้คือ ... เปราะบาง

ข้อมูลนี้จะต้องมีในบางระดับ มีเครื่องมือที่ฉันไม่ทราบว่าสามารถให้ข้อมูลนี้กับฉันได้หรือไม่?

คำตอบ:


17

ประเภทระบบไฟล์ไม่ใช่สิ่งที่คุณสามารถเข้าถึงได้อย่างง่ายดายในทางที่ไม่ขึ้นกับระบบปฏิบัติการ ชื่อประเภทระบบไฟล์นั้นขึ้นอยู่กับระบบปฏิบัติการดังนั้นจึงไม่มีแรงจูงใจที่จะสร้างวิธีการมาตรฐาน

บนระบบ Linux ที่ไม่ได้ฝังตัวstat -f -c %T .แสดงประเภทระบบไฟล์ของไดเรกทอรีปัจจุบัน statคำสั่งของ OSX ไม่มีอะไรเช่นนี้

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

if df -t sshfs -t nfs -t cifs . >/dev/null 2>/dev/null; then …

ไวยากรณ์เดียวกันอาจหรือไม่ทำงานบน OSX; df -T sshfs,nfs,cifs .ถ้ามันไม่ได้ลอง


นี่คือสิ่งที่ฉันต้องการ Gilles คุณยอดเยี่ยม!
ARX

7

คุณสามารถใช้ GNU บน Linux ได้:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs

สิ่งนี้ยอดเยี่ยมเพราะมันทำงานกับไดเรกทอรีย่อย ขอบคุณ!
Avindra Goolcharan

4

บน Linux มี findmnt อยู่ตั้งแต่ util-linux 2.18

findmnt -n -o FSTYPE -T /home
nfs4

ไม่ทำงานสำหรับ / home / subdir ดังนั้นจึงไม่ช่วย OP
Eloff

สำหรับฉันมันใช้งานได้สำหรับ subdirs ด้วยโดยใช้ findmount จาก util-linux 2.23
rudimeier

3

ยังไม่ได้ทดสอบ แต่df -Pควรมีพฤติกรรมเหมือนกันในแพลตฟอร์มส่วนใหญ่

สิ่งนี้ใช้ได้กับ Linux

$ mount | grep "^$(df -Pk . | head -n 2 | tail -n 1 | cut -f 1 -d ' ') " | cut -f 5 -d ' '

หรือทำลายมันลงในฟังก์ชั่นที่ใช้ซ้ำได้:

# get_mount <directory>
get_mount() {
    df -Pk "$1" | head -n 2 | tail -n 1 | cut -f 1 -d ' '
}

# get_fs <mountpoint>
get_fs() {
    mount | grep "^$1 " | cut -f 5 -d ' '
}

และเรียกใช้ฟังก์ชัน:

get_fs $(get_mount .)

อาจเขียนใหม่เพื่อให้ใช้งานได้เร็วขึ้นเล็กน้อยsedหรือawkแต่วิธีนี้อาจอ่านง่ายกว่า

หากยังไม่สามารถทำงานคุณอาจจะลองสิ่งที่คล้ายกัน แต่ใช้มากกว่าการส่งออกของ/etc/mtabmount


Pในdf -Pสำหรับ POSIX ดังนั้นจึงควรประพฤติในทางเดียวกัน อย่างไรก็ตามการได้รับจากพา ธ ของระบบไฟล์ไปยังจุดเมานท์นั้นน่าเที่ยวมากขึ้น
Gilles 'หยุดความชั่วร้าย'

1
โซลูชันของคุณดูเหมือนจะไม่ปลอดภัยหากติดตั้งไดเรกทอรีด้วย -o loop อย่างน้อยในระบบของฉัน df แสดงอุปกรณ์ลูปที่ใช้ แต่เมาต์แสดงไฟล์รูปภาพที่ใช้ ฉันเดาว่าอาจมีอีกหลายกรณีที่ df ไม่แสดงอุปกรณ์เดียวกันเช่น mount หมายเหตุใบเสนอราคานี้จาก man page ของเมานท์ "โหมดการแสดงรายการจะถูกเก็บไว้เพื่อความเข้ากันได้แบบย้อนหลังเท่านั้นสำหรับการแสดงผลที่แข็งแกร่งและชัดเจนยิ่งขึ้นให้ใช้ findmnt (8) โดยเฉพาะในสคริปต์ของคุณ"
rudimeier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.