"ประเภทไฟล์" บนระบบ 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 หรือบางอย่างตามสายเหล่านั้น