สั่งให้ค้นหาไฟล์ด้วยการค้นหาเพียงบางส่วนของชื่อ?


32

พูดว่ามีไฟล์ชื่อ:

batman.c
debate.c
cricketbat.c

คำสั่งอะไรและฉันควรใช้มันเพื่อแสดงรายการไฟล์ทั้งหมดโดยใช้ searchtag bat?


5
คุณต้องการแสดงรายการไฟล์ที่ตรงกันเฉพาะในไดเรกทอรีปัจจุบันหรือไม่? ในไดเรกทอรีใด ๆ ที่หรือด้านล่างของไดเรกทอรีปัจจุบัน? ทุกที่ในระบบ?
steeldriver

คำตอบ:


47

ค้นหาไฟล์ได้batทุกที่

ในการค้นหาไฟล์ทั้งหมดที่/path/to/folderมีชื่ออยู่ภายในbatคุณสามารถใช้:

find /path/to/folder -name '*bat*'

ฉันได้ยกมารูปแบบการค้นหา*bat*เพราะถ้าคำพูดที่ถูกมองข้ามและไฟล์ตรงกับ*bat*ในไดเรกทอรีปัจจุบันเปลือกจะขยาย*bat*เข้าไปในรายการของพวกเขาและผ่านที่findจะ ถ้าอย่างนั้นfindก็ไม่ทำงาน ( \*bat\*และ"*bat*"ยังใช้งานได้)

หากต้องการค้นหาในโฟลเดอร์ที่คุณอยู่ในปัจจุบัน (เช่นที่คุณเคยcdใช้) ให้ใช้.ตามปกติ:

find . -name '*bat*'

ในการค้นหาคอมพิวเตอร์ทั้งหมดของคุณใช้ /ในการค้นหาโฮมไดเร็กตอรี่ของคุณใช้~หรือชื่อเต็มของโฮมไดเร็กตอรี่ของคุณ ( เชลล์ขยาย~ไปยังพา ธ แบบเต็มของโฮมไดเร็กทอรีของคุณ)

ขยายหรือ จำกัด ขอบเขตการค้นหาของคุณตามชื่อ

หากคุณต้องการค้นหากรณี insensitively ดังนั้นไฟล์ที่มีBAT, bAtและอื่น ๆ จะถูกจับคู่ให้ใช้-inameการทดสอบแทนการ-nameทดสอบ:

find /path/to/folder -iname '*bat*'

.cฉันได้สังเกตเห็นท้ายไฟล์ทั้งหมดใน หากคุณต้องการค้นหาไฟล์เช่นนั้นให้ใช้:

find /path/to/folder -name '*bat*.c'

ฉันสังเกตว่าชื่อไฟล์ทั้งหมดของคุณมีbatตอนเริ่มต้นหรือตอนท้ายสุดของส่วนก่อนหน้า.cคำต่อท้าย หากคุณต้องการหลีกเลี่ยงการจับคู่ไฟล์เช่นembattled.cคุณสามารถใช้:

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-oเป็นหรือผู้ประกอบการ

การจับคู่ไฟล์เท่านั้น

ในการค้นหาไฟล์ปกติเท่านั้น- ไม่ใช่โฟลเดอร์ลิงก์สัญลักษณ์และโหนดอุปกรณ์พิเศษ - คุณสามารถ-type fใช้ได้ นี่เป็นคำแนะนำที่บ่อยครั้งและบางครั้งก็ค่อนข้างเหมาะสม ... แต่มักจะไม่ใช่สิ่งที่คุณต้องการโดยเฉพาะอย่างยิ่งถ้าคุณกำลังทำงานfindเพื่อจุดประสงค์ในการตรวจสอบผลลัพธ์ด้วยตัวคุณเอง หากคุณมีลิงค์สัญลักษณ์ที่ตรงกับการค้นหาของคุณคุณจะไม่ต้องการรู้เกี่ยวกับมัน?

หากคุณต้องการค้นหาทั้งไฟล์ปกติและลิงก์สัญลักษณ์คุณสามารถใช้:

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

ที่ใช้-oโอเปอเรเตอร์และเครื่องหมายวงเล็บสำหรับการจัดกลุ่ม (ซึ่งจะต้องยกมาด้วยดังนั้นเชลล์จะไม่จัดการกับมันเป็นพิเศษมิฉะนั้นคุณจะได้รับข้อผิดพลาดทางไวยากรณ์)

แต่สมมติว่าคุณต้องการเห็นลิงก์สัญลักษณ์ที่ชี้ไปที่ไฟล์ปกติในที่สุด (และไม่ใช่ลิงก์สัญลักษณ์ไปยังไดเรกทอรีโหนดอุปกรณ์ ฯลฯ ) ที่จริงได้ง่ายใช้งาน: ใช้แทน-xtype -typeหากคุณไม่ได้ทำงานfindกับการ-Lตั้งค่าสถานะ-xtypeบนลิงก์สัญลักษณ์ทดสอบประเภทของไฟล์ที่ลิงก์ชี้ไป

find /path/to/folder -name '*bat*' -xtype f

หากคุณมี symlink ไปยัง symlink อื่นในไฟล์-xtype fจะจับคู่แม้ว่าเป้าหมายโดยตรงของมันจะเป็น symlink อื่นแทนที่จะเป็นไฟล์ปกติ นี่คือสิ่งที่คุณต้องการเกือบทุกครั้ง

คนมักจะคิดว่าพวกเขาต้องการแต่จริงๆที่พวกเขาต้องการ-type f-xtype f

รับรายละเอียดผลลัพธ์

findการกระทำเริ่มต้นของหากคุณไม่ได้ระบุ-printไว้ คำสั่งทั้งหมดที่ให้ไว้ข้างต้นจะเทียบเท่ากับตัวเองที่-printติดอยู่ในตอนท้าย

findมักใช้เพื่อเรียกใช้คำสั่งตามไฟล์ที่พบบ่อยครั้งคำสั่งที่ทำการเปลี่ยนแปลง แต่ยังมีการกระทำอื่น ๆ -printที่มีวัตถุประสงค์เพื่อแสดงผลลัพธ์ที่นอกเหนือจาก สิ่งที่น่าสนใจเป็นพิเศษคือ-ls:

find /path/to/folder -name '*bat*' -ls

นี้จะช่วยให้รายละเอียดเกี่ยวกับแต่ละไฟล์ในรูปแบบหลายคอลัมน์คล้ายกับ ( แต่ไม่มากเช่นเดียวกับ) สิ่งที่คุณจะได้เห็นด้วยการวิ่งls file

อ่านเพิ่มเติม

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับfindวิธีการค้นหาไฟล์โปรดดู:


1
คำตอบที่ดีโดยเฉพาะ-xtypeคำแนะนำ; อาจls *bat*และ-maxdepth/ mindepthยังเป็นมูลค่าการกล่าวขวัญ
mklement0

2
@ mklement0 ขอบคุณ! OP ยังไม่ได้ให้ความกระจ่างเกี่ยวกับว่าไฟล์อยู่ที่ใดและจำเป็นต้องมีการสอบถามซ้ำหรือไม่ ในฐานะที่เป็นคำตอบของความสับสนวุ่นวายของปกคลุมlsแล้วฉันมุ่งเน้นไปที่กรณี recursive กับfindที่นี่ แน่นอนคำตอบโดยละเอียดที่ครอบคลุมรายการชื่อไฟล์ที่ไม่ซ้ำกัน (หรือน้อยกว่า) ที่ตรงกับรูปแบบ ( lsและfindด้วย-maxdepth) จะมีประโยชน์เช่นกัน คุณอาจต้องการโพสต์คำตอบดังกล่าว!
Eliah Kagan

16

วิธีที่ง่ายที่สุดคือเรียกใช้

locate bat

วิธีนี้คุณสามารถค้นหาไฟล์ที่มี "bat" ในคอมพิวเตอร์ได้จากชื่อไฟล์

เพื่อรีเฟรชรายการไฟล์บนพีซีของคุณ

updatedb

เรียกใช้คำสั่งนี้เมื่อคุณเพิ่งเพิ่มไฟล์ใหม่ในบัญชีของคุณ


1
ความต้องการupdatetdb
Sergiy Kolodyazhnyy

4
@Serg ในการค้นหาไฟล์ใหม่ (ใหม่กว่าครั้งล่าสุดที่ผ่านมาครั้งupdatedbสุดท้ายด้วยตนเองหรือเรียกใช้โดยอัตโนมัติ) sudo updatedbจะต้องมีการเรียกใช้ก่อนใช่
Eliah Kagan

batหมายเหตุที่ว่านี้จะค้นหาทั้งระบบสำหรับชื่อที่ตรงกัน
terdon

1
@terdon ฉันได้กล่าวไปแล้วในคำตอบอย่าคิดว่าสมควรได้รับการโหวตลงเมื่อฉันได้กล่าวถึงเรื่องนี้แล้ว
Mark Kirby

1
ทราบว่านี้เป็นจำนวนมากได้เร็วกว่าfind /เป็นlocateการค้นหาข้อมูลจากฐานข้อมูลในขณะที่findรายชื่อซ้ำ/แล้วตรงกับ regex ไม่
ทิโมธี Gu

14

เปิดเทอร์มินัลและเปลี่ยนไดเรกทอรีเป็นไดเรกทอรีที่คุณต้องการเริ่มการค้นหาแล้วเรียกใช้คำสั่งนี้:

find . -name "*bat*" -type f 

.เริ่มค้นหาคำสั่งจากไดเรกทอรีปัจจุบัน ตรงกับสตริงและเป็นกรณีที่สำคัญ ( ไม่คำนึงถึงขนาดตัวพิมพ์) การค้นหาไฟล์เท่านั้น
-namebat-iname
-type f


ลบและยกเลิกการลบไหม ตกลง +1: P;)
AB

6

หากไฟล์อยู่ในไดเรกทอรีปัจจุบันให้ใช้:

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

หรือ (เพื่อให้พวกเขาทีละบรรทัด):

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

หากคุณต้องการค้นหาไฟล์ระบบนั้นให้ใช้:

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
หากการค้นหาของคุณเริ่มต้นด้วยไดเรกทอรีรากคุณอาจต้องการเพิ่ม sudo เนื่องจากคำสั่งนี้จะรายงาน 'สิทธิ์ที่ถูกปฏิเสธ' สำหรับบางโฟลเดอร์
Sergiy Kolodyazhnyy

4

คุณต้องการใช้findคำสั่งโดยมี-inameตัวเลือกสำหรับการจับคู่ชื่อไฟล์ที่ไม่ตรงตาม-nameตัวพิมพ์ใหญ่หรือตัวเลือกสำหรับชื่อไฟล์ที่ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ทั้งสองอย่างนี้จะช่วยให้คุณใช้ชื่อตัวแทน ดังนั้นหากต้องการค้นหาชื่อไฟล์ใด ๆ ที่มี "bat" คุณจะต้องใช้:

find / -iname '*bat*'

หรือ

find / -name '*bat*'

*หมายถึง "ตัวอักษรใด ๆ (s)" เพื่อการค้นหาที่กำลังมองหาbatที่มีตัวอักษรใด ๆ รวมทั้งใครก่อนหรือหลังจากที่มัน การ/ค้นหาจากไดเร็กทอรีรูทแบบเรียกซ้ำคุณสามารถใช้.ซึ่งจะค้นหาแบบซ้ำ ๆ จากไดเร็กทอรีปัจจุบันหรือพา ธ สัมบูรณ์สำหรับตำแหน่งที่คุณต้องการค้นหา ดูวิธีค้นหาไฟล์โดยใช้ regex ใน linux shell script


@EliahKagan ขอบคุณฉันได้เพิ่มข้อมูลเพิ่มเติมลงในคำตอบของฉัน
AJefferiss

+1 ขอบคุณสำหรับการแก้ไข IMO มันเป็นความแข็งแรงของคำตอบนี้ว่ามันหลีกเลี่ยงการแนะนำการใช้ตามอำเภอใจของ-type fซึ่งจะมากกว่าเพียงแค่ไม่รวมไดเรกทอรีและเป็นมักจะไม่ได้สิ่งที่ผู้ใช้ต้องการจริงๆ
Eliah Kagan

2

findใช้ดีเก่า

find <path_for_search> -type f -iname "*bat*" 

เช่น.:

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

จากman find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

-iname pattern 
          Like -name, but the match is case insensitive.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.