ค้นหาไฟล์ทั้งหมดที่มีชื่อมีสตริง


177

ฉันค้นหาคำสั่งที่จะส่งคืนไฟล์จากไดเรกทอรีปัจจุบันซึ่งมีสตริงอยู่ในชื่อไฟล์ ฉันได้เห็นlocateและfindคำสั่งที่สามารถหาไฟล์ที่เริ่มต้นด้วยบางสิ่งบางอย่างหรือลงท้ายด้วยบางสิ่งบางอย่างfirst_word**.jpg

ฉันจะคืนรายการไฟล์ที่มีสตริงในชื่อไฟล์ได้อย่างไร

ตัวอย่างเช่นถ้า2012-06-04-touch-multiple-files-in-linux.markdownเป็นไฟล์ในไดเรกทอรีปัจจุบัน

ฉันจะคืนไฟล์นี้และผู้อื่นที่มีสตริงได้touchอย่างไร การใช้คำสั่งเช่นfind '/touch/'


คำถามกำลังสับสน คุณต้องการค้นหาไฟล์ที่มีสตริงหรือไฟล์ที่ชื่อมีสตริงดังกล่าวหรือไม่? คำถามแรกเป็นคำตอบกับที่สองด้วยman grep man findทำไมคุณถึง google แทนที่จะใช้คนฉันไม่รู้
แค่ใครสักคน

1
ขอบคุณ! ประโยคแรกไม่ได้ระบุว่าเป็นเนื้อหาของไฟล์หรือชื่อไฟล์ Updated
Dru

คำตอบ:


303

การใช้find:

find . -maxdepth 1 -name "*string*" -print

มันจะค้นหาไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน (ลบmaxdepth 1หากคุณต้องการมันซ้ำ) ที่มี "สตริง" และจะพิมพ์บนหน้าจอ

หากคุณต้องการหลีกเลี่ยงไฟล์ที่มี ':' คุณสามารถพิมพ์:

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

หากคุณต้องการใช้grep(แต่ฉันคิดว่ามันไม่จำเป็นเท่าที่คุณไม่ต้องการตรวจสอบเนื้อหาไฟล์) คุณสามารถใช้:

ls | grep touch

แต่ฉันขอย้ำว่าfindเป็นวิธีที่ดีและสะอาดกว่าสำหรับงานของคุณ


ขอบคุณ @Zagorax มันทำอะไรกันแน่ หวังว่าคำสั่งไม่ได้นาน แต่ Ayee :)
Dru

2
@Dru แก้ไขเพื่อครอบคลุมกรณีถ้าคุณต้องการหลีกเลี่ยง colons findเป็นเครื่องมือที่ทรงพลังมากมันจะต้อง 'ยาว' อย่างใด :)
Zagorax

ขอบคุณคนแรกทำได้อย่างสมบูรณ์แบบโดยไม่ส่งคืนเนื้อหาใด ๆ
Dru

3
@Dru หากคุณต้องการ 'สั้น' คุณสามารถหลีกเลี่ยงได้-printเนื่องจากนี่เป็นพฤติกรรมเริ่มต้นและ.เป็นโฟลเดอร์เริ่มต้นที่จะตรวจสอบ
Zagorax

1
find . -name "*string*"ใช้งานได้ดีเช่นกัน การลบ.เกิดข้อผิดพลาดในตอนท้ายของฉัน ขอบคุณอีกครั้ง @Zagorax
Dru

14

ใช้ grep ดังนี้:

grep -R "touch" .

-Rหมายถึงการชดเชย หากคุณไม่ต้องการเข้าไปในไดเรกทอรีย่อยให้ข้ามไป

-iหมายถึง "ละเว้นกรณี" คุณอาจพบว่ามันคุ้มค่าที่จะลองเช่นกัน


ยิ่งใหญ่ :ผมสังเกตเห็นว่าบางส่วนเนื้อหาของแฟ้มตาม อย่างไรก็ตามมีการระงับที่? ใช้ตัวเลือกบางที?
Dru

1
ลอง:grep -R "touch" . | cut -d ":" -f 2
carlspring

ดูเหมือนว่าจะผลิตเนื้อหาของไฟล์เท่านั้น คุณสามารถตอบคำถามของฉันเป็นหลักได้ฉันสามารถลองขุดเพื่อระงับเนื้อหาได้
Dru

อ่า ... คุณต้องการชื่อไฟล์เท่านั้น? เรียกใช้: grep -R "touch" . | cut -d ":" -f 1 (ขออภัยต้องทำให้คุณเข้าใจผิด)
carlspring

ขอบคุณ @carlspring สิ่งนี้น่าสนใจ grepส่งคืนไฟล์ที่มีเนื้อหาและชื่อไฟล์ที่มีtouchหรือเนื้อหาที่มีtouchฉันไม่แน่ใจว่าเป็นกรณีนี้ ในรายการของไฟล์ที่ส่งคืนครึ่งหนึ่งมีtouchอยู่ในชื่อเรื่องและอีกครึ่งหนึ่งมีtouchอยู่ในเนื้อหาไม่ใช่ชื่อเรื่อง เพิ่งรู้สิ่งนี้
Dru

5

-maxdepthตัวเลือกที่ควรจะเป็นก่อนที่จะมี-nameตัวเลือกเช่นนี้.

find . -maxdepth 1 -name "string" -print

1
คุณต้องใส่ * ก่อนและหลัง "สตริง"
Aerin

3
find $HOME -name "hello.c" -print

นี่จะค้นหาระบบทั้งหมด$HOME(เช่น/home/username/) สำหรับไฟล์ใด ๆ ที่ชื่อ“ hello.c” และแสดงชื่อพา ธ ของไฟล์เหล่านั้น:

/Users/user/Downloads/hello.c
/Users/user/hello.c

แต่ก็จะไม่ตรงหรือHELLO.C HellO.Cในการจับคู่นั้นต้องคำนึงถึง-inameตัวพิมพ์เล็กและใหญ่

find $HOME -iname "hello.c" -print

ตัวอย่างผลลัพธ์:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

ผ่าน-type fตัวเลือกเพื่อค้นหาไฟล์เท่านั้น:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

ใช้-inameงานได้ทั้งบน GNU หรือ BSD (รวมถึง OS X) คำสั่ง find หากเวอร์ชันคำสั่ง find ของคุณไม่รองรับ-inameให้ลองใช้ไวยากรณ์ต่อไปนี้โดยใช้grepคำสั่ง:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

หรือลอง

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

ตัวอย่างผลลัพธ์:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

0

หากสตริงอยู่ที่จุดเริ่มต้นของชื่อคุณสามารถทำได้

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

3
compgenไม่ใช่ค้อนที่เหมาะสมสำหรับเล็บนี้ เครื่องมือที่ใช้เล็ก ๆ น้อย ๆ นี้ได้รับการออกแบบมาเพื่อแสดงรายการคำสั่งที่มีอยู่และเช่นนั้นจะแสดงรายการไฟล์ในไดเรกทอรีปัจจุบัน (ซึ่งอาจเป็นสคริปต์) และไม่สามารถเรียกคืนหรือมองผ่านจุดเริ่มต้นของชื่อไฟล์หรือค้นหาเนื้อหาไฟล์ ส่วนใหญ่ไร้ประโยชน์
msanford

0

ทางเลือกในการแก้ปัญหาหลาย ๆ ที่มีให้อยู่แล้วทำให้การใช้ **glob เมื่อคุณใช้bashกับตัวเลือกglobstar( shopt -s globstar) หรือใช้ประโยชน์จากzshคุณสามารถใช้ glob **สำหรับสิ่งนี้

**/bar

ทำซ้ำไดเรกทอรีค้นหาไฟล์ชื่อbar(อาจรวมถึงไฟล์barในไดเรกทอรีปัจจุบัน) โปรดทราบว่าสิ่งนี้ไม่สามารถรวมกับรูปแบบอื่น ๆ ของการทำให้กลมเป็นก้อนได้ภายในส่วนของเส้นทางเดียวกัน ในกรณีนั้น*ผู้ประกอบการจะกลับไปใช้ผลปกติ

โปรดทราบว่ามีความแตกต่างเล็กน้อยระหว่างzshและbashที่นี่ ในขณะที่bashจะสำรวจลิงค์นุ่มไปยังไดเรกทอรีzshจะไม่ สำหรับนี้คุณต้องใช้ glob ใน***/zsh


0
find / -exec grep -lR "{test-string}" {} \;

1
คำตอบนี้ถูกตั้งค่าสถานะสำหรับคุณภาพต่ำ โปรดอธิบายว่าการเปลี่ยนแปลงที่เสนอของคุณทำอะไร
Miroslav Glamuzina

-2
grep -R "somestring" | cut -d ":" -f 1

2
สิ่งนี้ดูเหมือนจะเป็นคำตอบสำหรับคำถามอื่น - แต่เนื่องจากคุณไม่ได้ให้คำอธิบายจึงไม่ชัดเจนสำหรับผู้ถามหรือผู้อื่น
Toby Speight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.