บอกได้ว่าโฟลเดอร์ / ไฟล์ถูกซ่อนอยู่ใน Mac OS X


10

ฉันรู้ว่าคุณสามารถตั้งค่าหรือล้างค่าธงซ่อนของโฟลเดอร์ / ไฟล์ด้วยการทำและchflags hidden foo.txtchflags nohidden foo.txt

แต่มีการบอกว่าโฟลเดอร์ / ไฟล์ถูกซ่อนอยู่หรือไม่?

ฉันไม่ต้องการเพียงแค่ตรวจสอบว่าโฟลเดอร์ / ไฟล์เริ่มต้นด้วยจุด

คำตอบ:


10

ตามหน้าผู้ชาย lsคุณควรจะสามารถ-Oรวมตัวเลือกกับ-lตัวเลือกในการดูธงด้วย ls ตัวอย่างเช่น:

ls -Ol foo.txt
-rw-r--r-- 1 harry staff - 0 18 Aug 19:11 foo.txt
chflags hidden foo.txt
ls -Ol foo.txt
-rw-r--r-- 1 harry staff hidden 0 18 Aug 19:11 foo.txt
chflags nohidden foo.txt
ls -Ol foo.txt
-rw-r--r-- 1 harry staff - 0 18 Aug 19:11 foo.txt

แก้ไข: เพียงแค่ให้โซลูชันที่เฉพาะเจาะจงมากขึ้นกับสิ่งที่ OP ต้องการ (ดูความคิดเห็นด้านล่าง): หากต้องการดูว่าโฟลเดอร์ถูกซ่อนหรือไม่เราสามารถส่ง-aตัวเลือกให้ ls เพื่อดูโฟลเดอร์ได้ จากนั้นเราสามารถไพพ์เอาต์พุตลงในsed -n 2p(ขอบคุณStack Overflow ) เพื่อรับบรรทัดที่ต้องการของเอาต์พุตนั้น ตัวอย่าง:

mkdir foo
chflags hidden foo
ls -aOl foo | sed -n 2p
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .

แก้ไข 2: สำหรับคำสั่งที่ควรใช้งานไม่ว่าจะเป็นไฟล์หรือโฟลเดอร์เราจำเป็นต้องทำอะไรที่แฮ็กมากกว่านี้เล็กน้อย

บรรทัดเอาต์พุตที่ต้องการจากนั้นls -alแตกต่างกันไปขึ้นอยู่กับว่าไฟล์นั้นเป็นไฟล์หรือโฟลเดอร์เนื่องจากโฟลเดอร์แสดงจำนวนทั้งหมด แต่ไฟล์ไม่ได้ จะได้รับรอบนี้เราสามารถ grep rสำหรับตัวละคร สิ่งนี้ควรอยู่ใน ~ ทั้งหมดของไฟล์ / โฟลเดอร์ (เกือบทั้งหมดควรมีสิทธิ์อ่านอย่างน้อยหนึ่งรายการ) แต่ไม่ใช่ในบรรทัดผลรวม

เมื่อบรรทัดที่เราต้องการกลายเป็นบรรทัดแรกเราสามารถใช้head -n 1เพื่อรับบรรทัดแรก (เป็นทางเลือกหากคุณต้องการใช้ sed sed -n 1pสามารถใช้)

ตัวอย่างเช่นด้วยไดเรกทอรี:

mkdir foo
chflags hidden foo
ls -aOl foo | grep r | head -n 1
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .

และด้วยไฟล์:

touch foo.txt
chflags hidden foo.txt
ls -aOl foo.txt | grep r | head -n 1
-rw-r--r-- 1 harry staff hidden 0 18 Aug 19:11 foo.txt

แก้ไข 3: ดูคำตอบของ Tyilo ด้านล่างเพื่อหาวิธีที่ดีกว่า grepping สำหรับr:)


แต่การทำเช่นนี้กับโฟลเดอร์จะแสดงรายการแฟล็กสำหรับไฟล์ / โฟลเดอร์ที่อยู่ใต้นั้น
Tyilo

หากต้องการดูไฟล์ที่ซ่อนอยู่ให้ไพพ์ผ่าน grep (เช่นls -Ol fooDir/ | grep hidden) เพื่อดูเฉพาะไฟล์ / โฟลเดอร์ที่ซ่อน สิ่งนี้จะยังคงแสดงไฟล์ทั้งหมด แต่ถ้าคุณไพเราะด้วยเวทมนตร์ sed / awk (คนอื่นจะต้องช่วยที่นี่ฉันกลัว) คุณควรจะได้รับรายชื่อไฟล์

ฉันไม่ต้องการรายการไฟล์ที่ผมแค่อยากจะรู้ว่าเป็นโฟลเดอร์ "foo" จะถูกซ่อนอยู่หรือไม่
Tyilo

ตกลง. ดังนั้นเมื่อต้องการดูไดเรกทอรีเองให้เพิ่ม-aตัวเลือกใน ls หากต้องการรับบรรทัดที่คุณต้องการจากเอาต์พุตคุณสามารถใช้ sed ตัวอย่างเช่นls -aOl foo | sed -n 2p. นี่จะแสดงเอาต์พุตหนึ่งบรรทัด หากมันมีคำว่า "hidden" แสดงว่า foo ถูกซ่อนอยู่ หากไม่เป็นเช่นนั้นฟูจะไม่ถูกซ่อน :)

2
การใช้ls -Old dirname/จะแสดงคุณสมบัติของไดเรกทอรีเองไม่ใช่เนื้อหา
บาฮามาต

7

พบวิธีแก้ปัญหาที่นี่: ฉันจะทำให้ ls แสดงข้อมูลเกี่ยวกับไดเรกทอรีที่ระบุได้อย่างไรไม่ใช่ข้อมูลเกี่ยวกับไฟล์ย่อยหรือเนื้อหาของโฟลเดอร์

ซึ่งโดยทั่วไปls -ldO fooแล้วคุณเพียงแค่เพิ่ม| awk '{ print $5 }'เพื่อให้แสดงข้อมูล


1
โปรดระวังว่า awk จะแตกหากมีช่องว่างในชื่อผู้ใช้หรือชื่อกลุ่ม (ซึ่งน่าจะไม่น่าเป็นไปได้มาก แต่เฮ้) statฉันเพิ่มเป็นทางออกที่ปลอดภัยที่ใช้
MRM

1

ในฐานะที่อ้างอิงโดย@Tyilo , @Sorpigalแนะนำพยายามstatที่เข้ารหัส "ธงผู้ใช้" ด้วย%Xf(เขาXเข้ารหัสผู้ใช้ล่าช้า) และเป็นที่ปลอดภัยมากสำหรับการแยกเครื่อง

$ stat -f "%Xf" ~/Library
8000

ค่าเลขฐานสิบหกสำหรับแฟล็กผู้ใช้อยู่ที่นี่: grep UF /usr/include/sys/stat.h. จาก macOS 10.11:

#define UF_SETTABLE     0x0000ffff  /* mask of owner changeable flags */
#define UF_NODUMP       0x00000001  /* do not dump file */
#define UF_IMMUTABLE    0x00000002  /* file may not be changed */
#define UF_APPEND       0x00000004  /* writes to file may only append */
#define UF_OPAQUE       0x00000008  /* directory is opaque wrt. union */
/* #define UF_NOUNLINK  0x00000010 */   /* file may not be removed or renamed */
#define UF_COMPRESSED   0x00000020  /* file is hfs-compressed */
/* UF_TRACKED is used for dealing with document IDs.  We no longer issue
   notifications for deletes or renames for files which have UF_TRACKED set. */
#define UF_TRACKED      0x00000040
#define UF_HIDDEN       0x00008000  /* hint that this item should not be */
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.