รายการไฟล์แบบอ่านอย่างเดียว


3

ฉันต้องการแสดงรายการหรือแสดงหรือค้นหาไฟล์ในโฟลเดอร์ (ดี, ในทางเทคนิค, บนไดรฟ์ USB, แต่ฉันสามารถนำทางไปที่ Finder / Terminal) ที่ทำเครื่องหมายอ่านได้อย่างเดียว

Google-fu ในโลกทั้งหมดเพิ่งจะเปิดเผยวิธีแก้ไขสิทธิ์ แต่ฉันก็ไม่จำเป็นต้องทำเช่นนั้น

Dashcam ของฉันทำเครื่องหมายวิดีโอ / รูปภาพแบบอ่านอย่างเดียวเพื่อบันทึกเมื่อฉันกดปุ่มบนมัน แต่ยังคงอยู่ในโฟลเดอร์ที่มีไฟล์ MOV สองสามร้อยและฉันต้องการวิธีง่ายๆในการกรองสิ่งที่ฉันกำลังมองหา

คำตอบ:


1
find . -type f -perm +444 \! -perm +222

ค้นหาไฟล์ทั้งหมด ( -type f) ซึ่งสามารถอ่านได้ ( -perm +444) แต่ไม่สามารถเขียนได้ ( ! +perm +222)

ถ้าใจของคุณ boggles หลังจากที่ได้อ่านบน-permในman findคุณยังสามารถใช้ (ช้าลงอย่างมากโดยเฉพาะอย่างยิ่งบนอุปกรณ์ช้า) ตัวเลือกของการประมวลผลการส่งออกของfindตัวเอง

find . -type f -print0 |
    xargs -0 -n 1 sh -c '[ -r "$1" -a ! -w "$1" ] && echo "$1"' sh

โดยทั่วไปแล้วจะค้นหาแต่ละไฟล์findและเรียกใช้สคริปต์ shells ขนาดเล็กเพื่อตรวจสอบสิทธิ์

PS: เฮ้ฉันไม่ได้บอกว่าวิธีที่สองคือเหลือเชื่อน้อยกว่า :-)


1
แม้ว่าวิธีที่สองจะทำงานช้าลง แต่อาจแม่นยำกว่าในบางสถานการณ์หากฉันไม่ผิดกับตัวอย่างการทดสอบนี้: touch test_file; sudo chown root:staff test_file;(วิธีแรกล้มเหลวในการแสดงรายการไฟล์แม้ว่าจะเป็นไฟล์แบบอ่านอย่างเดียวสำหรับผู้ใช้)
Yoric

1
@Yoric ไม่มีวิธีแก้ปัญหาทั่วไปสำหรับการใช้งานนี้findเพียงอย่างเดียวดูunix.stackexchange.com/questions/22421/ …และคำถามดั้งเดิมที่เชื่อมโยงจากที่นั่น ในกรณีของ OP มันอาจไม่ใช่ปัญหา
nohillside

1
ขอบคุณหัวของฉันคือการปั่นตอนนี้มากที่จะเรียนรู้การขุดเป็น "คำถามง่ายๆ" :)
Yoric

1

วิธีหนึ่งคือการใช้ประโยชน์จาก-wตัวเลือกใน bash เพื่อตรวจสอบว่าไฟล์นั้นเขียนได้หรือไม่

ไปที่ไดเร็กทอรีที่คุณต้องการตรวจสอบไฟล์ของคุณจากนั้นป้อน:

for RO in $(find . -type f);do [ -r "$RO" ] && [ ! -w "$RO" ] && echo $RO;done

(เครดิตไปที่www.unix.com )

[แก้ไข]

หากต้องการจัดการช่องว่างในชื่อไฟล์ควรใช้find -execวิธีแทนการวนซ้ำในfind:

find . -type f -exec [ -r {} ] \; -exec [ ! -w {} ] \; -exec echo {} \;

หรือ

find . -type f -exec [ -r {} ] \; -exec [ ! -w {} ] \; -print

การแยกวิเคราะห์ข้อความfindโดยปกติแล้วจะแตกจากชื่อไฟล์ที่มีอักขระเว้นวรรคและคล้ายกัน อาจไม่เป็นปัญหาในบริบทที่ OP มี แต่อาจกระทบคุณในสถานการณ์อื่น
nohillside

@ โนฮิลไซด์ขอบคุณสำหรับหัวหน้าฉันแก้ไขกรณีแทนที่ห่วงด้วยการใช้find -exec
Yoric

คำพูดสุดท้ายของฉัน (หวังว่า): find . -type f -exec [ -r {} -a \! -w {} ] \; -printอ่านได้ง่ายกว่าความfind ... | xargs ... sh -cประหลาดใจในคำตอบของฉัน :-)
nohillside

-1

รายการไฟล์และ grep สำหรับรูปแบบอ่านอย่างเดียว:

ls -l | grep '^-r--'

^ สัญลักษณ์บ่งชี้ว่าเริ่มต้นบรรทัด

เรากำลังกรองเฉพาะไฟล์ที่นี่โดยกล่าวถึงหลังจากที่มองเฉพาะไฟล์สิทธิ์ในการอ่านโดยการระบุ^- หากคุณต้องการกรองอ่านและไฟล์ที่ได้รับอนุญาตปฏิบัติการคุณสามารถใช้r--r-x

หากคุณต้องการเพียงชื่อไฟล์คุณสามารถใช้คำสั่งด้านล่าง

ls -l | grep '^-r--' | awk 'NF>1{print $NF}'

การพิมพ์ชื่อไฟล์โดยใช้คำสั่งด้านบนใช้งานได้เฉพาะในกรณีที่คุณไม่มีช่องว่างในชื่อไฟล์


2
grepping ls -lเป็นวิธีที่ชาญฉลาดที่จะทำมัน แต่ระวังว่าไฟล์ของคุณอาจเริ่มต้นด้วย-rw-r--r--กับการrootเป็นเจ้าของและไฟล์ดังกล่าวจะไม่ได้รับการจดทะเบียนแม้ว่าพวกเขาจะไม่สามารถเขียนได้สำหรับผู้ใช้
Yoric

1
grep ... | awkไม่จำเป็นต้องใช้คำสั่งที่สองสามารถเขียนใหม่เป็นls -l | awk '/^-r--/ {print $NF}'
nohillside
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.