"ประเภทไฟล์" บนระบบ Unixเป็นสิ่งต่าง ๆ เช่นไฟล์ปกติไดเร็กตอรี่เนมที่มีชื่อไฟล์พิเศษของตัวละครลิงค์สัญลักษณ์ ฯลฯ ซึ่งเป็นประเภทของไฟล์ที่findสามารถกรองได้ด้วย-typeตัวเลือก
findยูทิลิตี้ไม่สามารถแยกแยะความแตกต่างด้วยตัวเองระหว่าง "เชลล์สคริปต์", "ไฟล์ภาพ JPEG" หรืออื่น ๆชนิดของไฟล์ปกติ อย่างไรก็ตามข้อมูลประเภทนี้อาจมีความแตกต่างจากfileยูทิลิตี้ซึ่งจะมีลักษณะเฉพาะในไฟล์เพื่อกำหนดประเภทของไฟล์
วิธีทั่วไปในการทำเลเบลไฟล์ข้อมูลชนิดต่าง ๆ คือประเภท MIMEและfileสามารถกำหนดประเภทไฟล์ MIME ได้
การใช้fileกับfindเพื่อตรวจจับชนิดไฟล์ MIME ปกติและใช้เพื่อค้นหาเชลล์สคริปต์เท่านั้น:
find . -type f -exec sh -c '
case $( file -bi "$1" ) in
*/x-shellscript*) exit 0
esac
exit 1' sh {} ';' -print
หรือใช้bash,
find . -type f \
-exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
-print
เพิ่ม-name sunriseก่อน-execหากคุณต้องการตรวจจับสคริปต์ด้วยชื่อนั้นเท่านั้น
findคำสั่งดังกล่าวจะพบไฟล์ปกติทั้งหมดในหรือด้านล่างของไดเรกทอรีปัจจุบันและสำหรับการโทรแต่ละไฟล์เช่นเชลล์สคริปต์สั้นในบรรทัด สคริปต์นี้จะทำงานบนไฟล์พบและออกที่มีสถานะออกศูนย์ถ้าผลลัพธ์ของคำสั่งที่มีสตริงfile -bi /x-shellscriptหากเอาต์พุตไม่มีสตริงนั้นจะออกด้วยสถานะการออกที่ไม่เป็นศูนย์ซึ่งทำให้findไฟล์ต่อไปทันทีโดยทันที หากพบว่าไฟล์เป็นเชลล์สคริปต์findคำสั่งจะดำเนินการส่งออกชื่อพา ธ ของไฟล์ ( -printที่ส่วนท้ายซึ่งอาจถูกแทนที่ด้วยการกระทำอื่น ๆ )
file -biคำสั่งออกจะชนิดไมม์ของไฟล์ สำหรับเชลล์สคริปต์บน Linux (และระบบอื่น ๆ ส่วนใหญ่) สิ่งนี้จะเป็นอย่างไร
text/x-shellscript; charset=us-ascii
ในขณะที่ระบบที่มีfileยูทิลิตี้รุ่นเก่ากว่าเล็กน้อยอาจเป็นได้
application/x-shellscript
บิตทั่วไปคือ/x-shellscriptสตริงย่อย
โปรดทราบว่าใน macOS คุณจะต้องใช้file -bIแทนfile -biเพราะเหตุผล ( -iตัวเลือกทำสิ่งที่แตกต่างกันมาก) เอาต์พุตบน macOS คล้ายกับของระบบ Linux
คุณต้องการที่จะดำเนินการกระทำที่กำหนดเองบางส่วนในแต่ละสคริปต์เชลล์พบคุณสามารถทำอย่างนั้นกับคนอื่น-execในสถานที่ของ-printในfindคำสั่งดังกล่าว แต่มันจะยังเป็นไปได้ที่จะทำ
find . -type f -exec sh -c '
for pathname do
case $( file -bi "$pathname" ) in
*/x-shellscript*) ;;
*) continue
esac
# some code here that acts on "$pathname"
done' sh {} +
หรือมีbash,
find . -type f -exec bash -c '
for pathname do
[[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue
# some code here that acts on "$pathname"
done' bash {} +
ที่เกี่ยวข้อง:
--filetypeตัวเลือกสำหรับคำสั่ง find หรือสิ่งอื่นใดที่จะบอกคุณถึงประเภทของไฟล์ สิ่งเดียวที่คุณสามารถทำได้คือใช้--exec file {} \;แล้วก็สอดเข้าไปgrep Bourneหากคุณกำลังมองหาสคริปต์ทุบตีหรือgrep Perlหากคุณกำลังมองหาสคริปต์ Perl หรือบางอย่างตามสายเหล่านั้น