การ ค้นหา คำสั่งในเปลือก Linux ช่วยให้คุณค้นหาไฟล์ในระบบไฟล์ สามารถค้นหาไฟล์ตามชื่อ สิทธิ์ของผู้ใช้ และขนาด การ ค้นหา คำสั่งยังสามารถดำเนินการกับไฟล์ที่พบได้
ค้นหาไวยากรณ์คำสั่ง
ไวยากรณ์สำหรับ find คำสั่งมีดังนี้:
find [OPTIONS] [PATH] [EXPRESSION]
ที่ไหน:
- [ตัวเลือก] เป็นตัวเลือกจากตารางด้านล่างเพื่อกำหนดพฤติกรรมการค้นหา
- [เส้นทาง] เป็นจุดเริ่มต้นของการค้นหา
- [การแสดงออก] กำหนดการทดสอบเพื่อค้นหาไฟล์ที่ตรงกันและการดำเนินการใด ๆ ที่ควรทำกับไฟล์ที่พบ
ตัวเลือก
ต่อไปนี้คือ ตัวเลือก . ที่ใช้กันทั่วไป สำหรับค้นหา คำสั่งดัดแปลงจากคู่มือ:
-P | อย่าติดตามลิงก์สัญลักษณ์ นี่เป็นพฤติกรรมเริ่มต้น |
-L | ติดตามลิงก์สัญลักษณ์ เมื่อ find ตรวจสอบหรือพิมพ์ข้อมูลเกี่ยวกับไฟล์ ข้อมูลที่ใช้จะต้องนำมาจากคุณสมบัติของไฟล์ที่ลิงค์ชี้ไป ไม่ใช่จากลิงค์เอง |
-H | อย่าติดตามลิงก์สัญลักษณ์ ยกเว้นในขณะที่ประมวลผลอาร์กิวเมนต์บรรทัดคำสั่ง |
นิพจน์
ข้อความทั่วไปบางส่วนจาก fin คู่มือที่ใช้สร้าง การแสดงออก ซึ่งทดสอบหาไฟล์ที่ตรงกันและเลือกดำเนินการกับไฟล์เหล่านั้น:
การทดสอบ (เงื่อนไขการค้นหา) | |
---|---|
ว่าง | ค้นหาไฟล์ว่าง |
-ปฏิบัติการได้ | จับคู่ไฟล์ที่เป็นไดเร็กทอรีปฏิบัติการและค้นหาได้ |
-group ชื่อ | ไฟล์อยู่ในกลุ่มที่มี ชื่อ |
-mtime n | ข้อมูลไฟล์ถูกแก้ไขล่าสุดน้อยกว่า มากกว่า หรือเท่ากับ n*24 ชั่วโมงที่แล้ว |
-name รูปแบบ | ฐานของชื่อไฟล์ (พาธที่นำไดเร็กทอรีนำออก) ตรงกับรูปแบบ pattern |
รูปแบบเส้นทาง | เส้นทางของไฟล์ตรงกับรูปแบบ รูปแบบ |
อ่านได้ | จับคู่ไฟล์ที่ผู้ใช้ปัจจุบันอ่านได้ |
-size n | ไฟล์ใช้พื้นที่น้อยกว่า มากกว่าหรือเท่ากับ n หน่วย ปัดขึ้น (ดูตารางด้านล่างสำหรับหน่วยที่มีอยู่) |
-type c | ไฟล์เป็นประเภท c (ดูตารางด้านล่างสำหรับค่า c ) |
-user ชื่อ | ไฟล์เป็นของ ชื่อ ผู้ใช้ |
การกระทำ | |
---|---|
ส่งออกชื่อไฟล์ (การดำเนินการเริ่มต้น) | |
-พรุน | Ff ไฟล์เป็นไดเร็กทอรี อย่าลงไปเลย |
-ความลึก | ประมวลผลเนื้อหาของแต่ละไดเร็กทอรีก่อนตัวไดเร็กทอรีเอง |
-ลบ | ลบไฟล์ที่ตรงกัน การดำเนินการ -delete ยังทำหน้าที่เป็นตัวเลือกด้วย (เนื่องจากหมายถึง -ความลึก) |
-exec คำสั่ง | ดำเนินการ คำสั่ง |
-execdir คำสั่ง | ชอบ -exec แต่คำสั่งที่ระบุถูกเรียกใช้จากไดเรกทอรีย่อยที่มีไฟล์ที่ตรงกัน |
-ok คำสั่ง | ชอบ -exec แต่ให้ถามผู้ใช้ก่อน |
-okdir คำสั่ง | ชอบ -execdir แต่ให้ถามผู้ใช้ในลักษณะเดียวกับ -ok ก่อน |
-printf รูปแบบ | พิมพ์รายละเอียดไฟล์ใน รูปแบบ |
ตัวดำเนินการในนิพจน์
ตัวดำเนินการสามารถใช้เพื่อเชื่อมโยงรายการในนิพจน์:
-o | หรือ |
-a | AND (ตัวดำเนินการเริ่มต้นระหว่างนิพจน์เมื่อไม่มีตัวดำเนินการที่ให้มา |
สำหรับรายการตัวเลือกและนิพจน์ทั้งหมดสำหรับการค้นหาไฟล์ คุณสามารถเรียกใช้สิ่งต่อไปนี้:
man find
ค้นหาตัวอย่างคำสั่ง
ตัวเลือก นิพจน์ และการดำเนินการสามารถรวมกันเพื่อสร้างการดำเนินการค้นหาอย่างง่ายเพื่อแสดงรายการไฟล์ที่ตรงกันหรือการดำเนินการที่ซับซ้อนที่สามารถค้นหาไฟล์ตามเงื่อนไขที่ซับซ้อนและดำเนินการได้ ดูตัวอย่างด้านล่าง:
ค้นหาไฟล์ตามชื่อไฟล์
ตัวอย่างนี้ค้นหาไฟล์ทั้งหมดที่ชื่อ myfile ในไดเรกทอรี /home/screw :
find /home/screw -name myfile
ค้นหาตามประเภท
คำสั่งด้านบนจะส่งคืนไฟล์ที่ตรงกันทั้งหมด – รวม ไดเร็กทอรี ลิงค์ และอุปกรณ์ – ทุกอย่างในระบบไฟล์
-type f นิพจน์จำกัดการค้นหาเฉพาะ ไฟล์ เท่านั้น. ในการค้นหาไฟล์ชื่อ myfile :
find /home/screw -type f -name myfile
หรือค้นหาเฉพาะไดเรกทอรี:
find /home/screw -type d -name myfile
ประเภทที่มีจำหน่ายคือ:
b | บล็อก (บัฟเฟอร์) พิเศษ |
ค | ตัวละคร (ไม่มีบัฟเฟอร์) พิเศษ |
d | ไดเรกทอรี |
p | เนมไปป์ (FIFO) |
f | ไฟล์ธรรมดา |
ล | ลิงค์สัญลักษณ์; สิ่งนี้จะไม่เป็นจริงหากตัวเลือก -L หรือตัวเลือก -follow มีผล เว้นแต่ลิงก์สัญลักษณ์จะใช้งานไม่ได้ |
s | ซ็อกเก็ต |
ความไวของตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
The -name ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ – เพื่อค้นหาโดยไม่พิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ -iname :
find /home/screw -iname mYFiLe
ค้นหาไฟล์ตามนามสกุลโดยใช้สัญลักษณ์แทนและ Regex
คุณสามารถใช้ ไวด์การ์ด (* ) ในชื่อไฟล์ ซึ่งช่วยให้คุณสามารถค้นหาตามนามสกุลไฟล์:
find -L /home/screw -name '*.pdf'
ด้านบนจะค้นหาไฟล์ทั้งหมดที่มี .pdf การขยาย. รูปแบบการค้นหาที่ยกมาสามารถมี regex ได้
การละเว้นไฟล์ตามชื่อหรือนามสกุล
ที่ -ไม่ ตัวดำเนินการสามารถใช้เพื่อละเว้นไฟล์ตามชื่อหรือรูปแบบ โดยส่งคืนผลลัพธ์ทั้งหมดที่ไม่ตรงกัน:
find /home/screw -type f -not -name '*.pdf'
ละเว้นไดเรกทอรีทั้งหมดจากผลลัพธ์
ใช้ -prune ตัวเลือกที่จะละเว้นเส้นทางที่ตรงกันและเนื้อหา ตัวอย่างด้านล่างจะข้าม /home/screw/junk ไดเรกทอรีจากผลลัพธ์:
find /home/screw -path /home/screw/junk -prune -o -print
ค้นหาไฟล์ตามขนาด
ตัวอย่างนี้ค้นหาไฟล์ทั้งหมดที่น้อยกว่า 500 กิโลไบต์:
find /home/screw -type f -size -500k
ไฟล์นี้จะค้นหาไฟล์ที่มีขนาดระหว่าง 100 ถึง 200 กิโลไบต์โดยผ่านเงื่อนไขสองขนาด:
find /home/screw -type f -size +100k -size -200k
หน่วยที่สามารถค้นหาตามขนาดคือ:
b | บล็อกขนาด 512 ไบต์ (นี่เป็นค่าเริ่มต้นหากไม่มีการใช้ส่วนต่อท้าย) |
ค | ไบต์ |
w | คำสองไบต์ |
k | กิโลไบต์ (KiB หน่วย 1024 ไบต์) |
ม | เมบิไบต์ (MiB หน่วย 1024 * 1024 =1048576 ไบต์) |
ก | กิบิไบต์ (GiB หน่วย 1024 * 1024 * 1024 =1073741824 ไบต์) |
วันที่แก้ไขหรือเข้าถึง
ตัวอย่างต่อไปนี้จะค้นหา .txt . ทั้งหมด ไฟล์ที่แก้ไขในช่วง 14 วันที่ผ่านมา:
find /home/screw -name '*.txt' -mtime 14
หากต้องการค้นหาโดยเข้าถึง lastล่าสุด แทน การปรับเปลี่ยน วันที่ ใช้ -atime ตัวเลือกแทน -mtime .
คุณยังสามารถเพิ่มเครื่องหมาย (+ หรือ – ) เพื่อค้นหาไฟล์ที่แก้ไขมากกว่าหรือน้อยกว่าช่วงเวลาที่กำหนด – ตัวอย่างนี้จะส่งคืนไฟล์ที่แก้ไขมากกว่า 14 วันที่ผ่านมา
find /home/screw -name '*.txt' -mtime +14
หากต้องการใช้นาทีแทนวันเป็นหน่วยเวลา ให้แทนที่ -mmin -อามิน แทน -mtime และ -atime .
ตามปกติแล้ว มีตัวเลือกให้มิกซ์แอนด์แมตช์มากขึ้น ทั้งหมดมีอยู่ในคู่มือนี้ โดยเรียกใช้ได้:
man find
เจ้าของ ผู้ใช้/กลุ่ม
หากต้องการค้นหาไฟล์ทั้งหมดที่ root เป็นเจ้าของใน /home/screw ไดเรกทอรีรัน:
find /home/screw -user root
สิทธิ์
คำสั่งต่อไปนี้จะค้นหาไฟล์ทั้งหมดที่มีสิทธิ์ในการอ่าน/เขียนทั่วโลก:
find /home/screw -perm 777
ดูบทความของเราเกี่ยวกับ chmod คำสั่งและหน้าที่ของมัน
การผสมผสาน
สามารถใช้นิพจน์การค้นหาร่วมกันได้ หากไม่มีโอเปอเรเตอร์อยู่ระหว่างโอเปอเรเตอร์ จะถือว่าต้องตรงตามเงื่อนไขทั้งสองข้อเพื่อให้ไฟล์ตรงกัน (กล่าวคือ ตัวดำเนินการ AND เป็นค่าเริ่มต้น)
ตัวอย่างนี้ค้นหาไฟล์ข้อความทั้งหมดที่สร้างขึ้นในช่วง 14 วันที่ผ่านมาน้อยกว่า 500kb:
find /home/screw -name '*.txt' -mtime 14 -type f -size -500k
การดำเนินการกับไฟล์ที่พบ
โดยค่าเริ่มต้น คำสั่ง find จะพิมพ์ผลลัพธ์การดำเนินการ find (เหมือนกับการเรียก -print การกระทำ)
find /home/screw -name myfile -print
การปรับแต่งรูปแบบผลลัพธ์
คุณสามารถปรับแต่งผลลัพธ์ของผลลัพธ์เพื่อรวมข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ที่พบ ตัวอย่างนี้พิมพ์ชื่อไฟล์ ตามด้วยขีดคั่น ตามด้วยขนาดของไฟล์เป็นไบต์:
find /home/screw -name '*.txt' -printf '%f - %s bytes'
สามารถใช้ตัวแปรจำนวนมากเพื่อปรับแต่งเอาต์พุต ตั้งแต่ขนาดไฟล์ไปจนถึงฟิลด์วันที่แต่ละฟิลด์สำหรับการแก้ไขไฟล์และเวลาในการเข้าถึง โปรดดูคู่มือสำหรับรายการทั้งหมด
การเขียนผลลัพธ์ลงไฟล์
เปลี่ยนเส้นทางผลลัพธ์ของ ค้นหา ดำเนินการกับไฟล์ข้อความ:
find /home/screw -name myfile > find_results.txt
กำลังลบ
ที่ -ลบ การดำเนินการจะลบไฟล์ที่ตรงกัน (โดยไม่มีการยืนยัน ระวังด้วย!):
find /home/screw -name '*.junk' -delete
ดำเนินการคำสั่งด้วย -exec / *-execdir *
คุณสามารถรันคำสั่งเชลล์กับ find . แต่ละรายการได้ ผลลัพธ์โดยใช้ -exec การกระทำ:
find /home/screw -name '*.txt' -exec ls -la {} ';'
-exec จะรันคำสั่งจากไดเร็กทอรีการทำงานปัจจุบัน ในการรันคำสั่งจากตำแหน่งของไฟล์ที่พบ ให้ใช้ -execdir แทน:
find /home/screw -name '*.txt' -execdir ls -la {} ';'
ในสองตัวอย่างข้างต้น ls -la ถูกเรียกใช้กับแต่ละผลลัพธ์ วงเล็บปีกกา {} จะถูกแทนที่ด้วยผลลัพธ์คำสั่ง find และ ‘;’ ยุติอาร์กิวเมนต์บรรทัดคำสั่งสำหรับ ls สั่งให้หา รู้ว่ามันสิ้นสุดที่ไหน
พร้อมท์ให้ยืนยันด้วย -ok / -okdir
ที่ -ตกลง การทำงานเหมือนกับ -exec การดำเนินการ แต่จะถามคุณก่อนที่จะรันคำสั่งที่กำหนด สิ่งนี้มีประโยชน์หากคุณต้องการลบไฟล์ แต่จะถูกถามก่อนที่จะลบแต่ละไฟล์:
find /home/screw -name '*.txt' -ok rm {} ';'
-okdir พร้อมท์ แต่รันคำสั่งจากตำแหน่งของไฟล์ที่พบ:
find /home/screw -name '*.txt' -okdir rm {} ';'