โหมดเรียกซ้ำใช้งานได้เฉพาะกับไดเรกทอรีไม่ใช่ไฟล์ ด้วยการใช้ glob '* .pdf' เชลล์จะส่งรายการไฟล์ไปยัง chown ซึ่งจะเห็นว่าไฟล์เหล่านี้เป็นไฟล์และเปลี่ยนแปลงการอนุญาตในไฟล์ที่เห็นและนั่นคือสิ่งที่มันทำ
จำไว้ว่าในเชลล์นั้น glob จะถูกประเมินโดยเชลล์ไม่ใช่คำสั่ง หาก glob จับคู่ไฟล์จะถูกส่งไปยังคำสั่งและคำสั่งจะไม่ทราบว่ามีไฟล์ glob อยู่ (สิ่งนี้แตกต่างจากวิธีใช้พรอมต์คำสั่งของ Windows ในการทำสิ่งต่าง ๆ ) หากคุณมี dir ด้วยเนื้อหาคล้าย:
machine:$ ls -F
file1.pdf file2.pdf other.txt subdir/
และคุณพิมพ์:
chown -R someuser:somegroup *.pdf
เชลล์จะสร้างรายการก่อน: file1.pdf file2.pdf
จากนั้นเรียกใช้คำสั่งของคุณ:
chown -R someuser:somegroup file1.pdf file2.pdf
ดูไม่มีไดเรกทอรีสำหรับ -R ที่จะดำเนินการ มันทำในสิ่งที่คุณถาม - เปลี่ยนความเป็นเจ้าของในสองไฟล์บนบรรทัดคำสั่งโดยไม่สนใจแฟล็ก -R ที่เล่นโวหารนั้น
ในการทำสิ่งที่คุณต้องการหากต้องการใช้ '* .pdf' เป็นรูปแบบสำหรับไดเรกทอรีและไดเรกทอรีย่อยนี้คุณสามารถใช้find
ซึ่งสามารถค้นหาไฟล์ที่ตรงกับรูปแบบชื่อไฟล์ (หรือ criterea อื่น ๆ อีกมากมาย) และส่งไปยังคำสั่งย่อย
find . -type f -name '*.pdf' | xargs chown someuser:somegroup
สิ่งนี้จะเริ่มใน dir ปัจจุบัน '.' เพื่อค้นหาไฟล์ (ชนิดไฟล์ f) ของรูปแบบชื่อ'*.pdf'
จากนั้นส่งผ่านไปยัง xargs ซึ่งสร้างบรรทัดคำสั่งไปยัง chmod สังเกตคำพูดที่อยู่รอบ ๆ รูปแบบ'*.pdf'
จำไว้ว่าเชลล์จะสร้างรูปกลมถ้าทำได้ แต่คุณต้องการรูปแบบที่ส่งผ่านfind
ดังนั้นคุณจำเป็นต้องอ้างอิง
เนื่องจากชื่อไฟล์อาจมีช่องว่างในนั้นคุณต้องการใช้เคล็ดลับเพื่อทำให้ชื่อไฟล์พร้อมช่องว่างปลอดภัย:
find . -type f -name '*.pdf' -print0 | xargs -0 chown someuser:somegroup
ใน bash 3 และต่ำกว่านี่คือวิธีที่คุณต้องทำ ทรงกลมที่ทรงพลังกว่ามีให้ใน bash 4 (พร้อมshopt -s globstar
) และกระสุนอื่น zsh เหมือนกันโดยใช้ glob ซ้ำ**
:
chown -R someuser:somegroup ./**/*.pdf
shopt -s globstar
ไม่ซ้ำกลม