Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

ค้นหาคำสั่งใน Linux [พร้อมตัวอย่างที่เป็นประโยชน์]

การ ค้นหา คำสั่งในเปลือก 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 ชื่อ ไฟล์เป็นของ ชื่อ ผู้ใช้
การกระทำ
-print ส่งออกชื่อไฟล์ (การดำเนินการเริ่มต้น)
-พรุน 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 {} ';'