มีคำสั่งหนึ่งบรรทัดเพื่อให้ chmod แบบโต้ตอบ?


24

ฉันกำลังมองหาบางสิ่งที่ชอบ:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

หรือไวยากรณ์ที่คล้ายกัน

ยังสามารถทำงานกับคำสั่งอื่น ๆ ที่คุณต้องการการยืนยันเป็นรายบุคคลสำหรับ

คำตอบ:


45

นี่คือสิ่งที่คุณกำลังมองหา:

find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x

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

คำอธิบาย

  • find . -maxdepth 1 -type f -print0

    นี่เป็นการเลือกไฟล์ สามารถกำหนดเองได้โดยใช้ตัวเลือกมากมายของ find ตัวเลือกprint0บอกfindให้พิมพ์ชื่อไฟล์ในรายการที่คั่นด้วย null นี่เป็นเพียงความน่าเชื่อถือในการส่งรายชื่อไฟล์

  • xargs -L1 -p0 chmod +x

    นี่ใช้รายการชื่อไฟล์ที่คั่นด้วย null ซึ่งสร้างโดยfindและใช้คำสั่งของคุณกับพวกเขา

-L1ตัวเลือกที่บอกxargsการทำงานที่ชื่อไฟล์เพียงหนึ่งครั้ง -pตัวเลือกที่บอกxargsเพื่อความพร้อมในการอนุมัติก่อนดำเนินการต่อ -0ตัวเลือกที่บอกxargsจะใช้ตัวอักษรเป็นโมฆะเป็นตัวคั่นระหว่างชื่อไฟล์

[ฉันไม่รู้-pตัวเลือกxargsจนกระทั่ง @kwan ชี้ให้เห็น]


คุณสามารถทำให้findPOSIX -exec printf '%s\0' {} +คำสั่งที่เข้ากันได้โดยใช้ อย่าคิดว่าจะมีวิธีที่จะทำให้ POSIX ทำงานร่วมกันได้
l0b0

ไวยากรณ์นี้ทำให้ผมเตือนfind: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.ดังนั้นจึงทำงานร่วมกับ-maxdepth 1ก่อนที่จะเป็น:-type f find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x
Harvey

@ ฮาร์วี่คุณถูกต้อง: ฉันอัปเดตคำตอบเพื่อลบคำเตือนนั้น
John1024

25

xargsคุณสามารถใช้

เช่น:

ls|xargs -I path -p chmod +x path

ตัวเลือก-p: แจ้ง ให้ผู้ใช้ทราบเกี่ยวกับการเรียกใช้แต่ละบรรทัดคำสั่งและอ่านบรรทัดจากเทอร์มินัล รันเฉพาะบรรทัดคำสั่งหากการตอบกลับเริ่มต้นด้วย 'y' หรือ 'Y'


1
+1 ฉันชอบที่คุณใช้งานxargs -pมากจนฉันจะคัดลอกมัน
John1024

1
ที่สมบูรณ์แบบ! และเป็นวิธีที่ง่ายที่สุดในการทำให้คำสั่งแบบโต้ตอบ ขอบคุณ
ฮาร์วีย์


@Kroltan - ทำไมทุกคนจะใช้บรรทัดใหม่ในชื่อไฟล์
nbubis

1
@nbubis สามารถเกิดขึ้นได้: ไปที่เทอร์มินัลแล้วพิมพ์touch "a very long file nameและกด Enter ดูความต่อเนื่องของบรรทัดและพิมพ์ใบเสนอราคาปิดแล้วกด Enter อีกครั้ง tadaa ขึ้นบรรทัดใหม่ในชื่อไฟล์ ออกจากความเกียจคร้านเพื่อพิมพ์ชื่อไฟล์ยาวอีกครั้ง
Kroltan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.