จะ "grep" สำหรับชื่อไฟล์แทนเนื้อหาของไฟล์ได้อย่างไร?


141

grep ใช้เพื่อค้นหาภายในไฟล์เพื่อดูว่าบรรทัดใดตรงกับนิพจน์ทั่วไปที่กำหนดหรือไม่ อย่างไรก็ตามฉันมีสถานการณ์นี้ - ฉันต้องการเขียนนิพจน์ทั่วไปที่ตรงกับชื่อไฟล์เอง (ไม่ใช่เนื้อหาของไฟล์) ฉันจะเรียกใช้สิ่งนี้จากไดเร็กทอรีรูทของระบบเพื่อค้นหาไฟล์ทั้งหมดที่ตรงกับนิพจน์ทั่วไป

ตัวอย่างเช่นถ้าฉันต้องการค้นหาไฟล์ฟอร์ม VB ทั้งหมดที่ขึ้นต้นด้วย "f" และลงท้ายด้วย. fr ฉันจะใช้นิพจน์ทั่วไป -

   "f[[:alnum:]]*\.frm"

grep ทำได้ไหม? ถ้าไม่มียูทิลิตี้ที่จะให้ฉันทำสิ่งนี้หรือไม่? ขอบคุณ.

คำตอบ:


125

คุณต้องใช้findแทนgrepในกรณีนี้

คุณยังสามารถใช้findร่วมกับgrepหรือegrep:

$ find | grep "f[[:alnum:]]\.frm"

12
สิ่งนี้ไม่จำเป็น Find มีฟังก์ชันการทำงานที่มาพร้อมกับ-regexตัวเลือก
whereswalden

6
มันไม่จำเป็นที่นี่ แต่ grep รองรับ perl regex ในขณะที่ find ไม่ได้
แดน

3
ไม่คุณสามารถใช้ grep วิธีที่ง่ายกว่าการใช้การค้นหา เพิ่มสวิตช์ "-rl" และจะค้นหาชื่อไฟล์แทนไฟล์ ดูโพสต์ของฉันด้านล่าง
RM

@ alpha_989 ฉันบอกว่า grep รองรับซึ่งมันทำ: gnu.org/software/grep/manual/html_node/… point คือการส่งไปยัง grep จำเป็นเฉพาะในกรณีที่คุณต้องการ pcre Whereswalden มีคำตอบที่ถูกต้อง
Dan

64

ตัวอย่าง

find <path> -name *FileName*

จากคู่มือ:

ค้นหารูปแบบชื่อ

ฐานของชื่อไฟล์ (พา ธ ที่นำไดเร็กทอรีนำออก) ตรงกับรูปแบบรูปแบบเชลล์ เนื่องจากไดเร็กทอรีนำหน้าถูกลบออกชื่อไฟล์ที่พิจารณาสำหรับการจับคู่กับ -name จะไม่รวมเครื่องหมายทับดังนั้น "-name a / b" จะไม่ตรงกับสิ่งใดเลย (คุณอาจต้องใช้ -path แทน) อักขระเมตา ("*", "?" และ "[]") ตรงกับ "." ที่จุดเริ่มต้นของชื่อฐาน (นี่คือการเปลี่ยนแปลงใน find-utils-4.2.2 ดูส่วนการปฏิบัติตามมาตรฐานด้านล่าง) หากต้องการละเว้นไดเร็กทอรีและไฟล์ที่อยู่ข้างใต้ให้ใช้ -prune; ดูตัวอย่างในคำอธิบายของ -path เครื่องมือจัดฟันไม่ได้รับการยอมรับว่ามีความพิเศษแม้ว่าเปลือกหอยบางชนิดรวมถึง Bash จะมีความหมายพิเศษในรูปแบบเปลือก การจับคู่ชื่อไฟล์จะดำเนินการโดยใช้ฟังก์ชันไลบรารี fnmatch (3) อย่าลืมใส่รูปแบบในเครื่องหมายคำพูดเพื่อป้องกันไม่ให้เปลือกขยายออก


3
ฉันพบว่าคำตอบนี้มีประโยชน์มากที่สุด ฉันได้เพิ่มตัวเลือกเพิ่มเติมสองสามตัว: find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

ในฐานะที่เป็นปาโบลกล่าวว่าคุณต้องใช้findแทนgrepแต่มีไม่จำเป็นต้องท่อไปfind มีฟังก์ชันดังกล่าวในตัว:grepfind

find . -regex 'f[[:alnum:]]\.frm'

findเป็นโปรแกรมที่มีประสิทธิภาพมากสำหรับการค้นหาไฟล์ตามชื่อและรองรับการค้นหาตามประเภทไฟล์การจำกัดความลึกการรวมคำค้นหาที่แตกต่างกันเข้ากับการทำงานแบบบูลีนและการรันคำสั่งตามอำเภอใจกับไฟล์ที่พบ ดูหน้าค้นหาสำหรับข้อมูลเพิ่มเติม


1
ฉันจะเพิ่มคุณสมบัติที่มีประโยชน์มากในการค้นหาเพื่อค้นหาตามวันที่ด้วย-mtimeและ-mmin
Johnride

1
นอกจากนี้สวิตช์ -regex ยังจับคู่กับเส้นทางทั้งหมด ดังนั้นในการทำงานตัวอย่างจำเป็นต้องเพิ่ม * ที่จุดเริ่มต้น regex
tumasgiu

18

คุณสามารถค้นหาเส้นทางแบบเต็มของไฟล์โดยใช้ grep เพียงแค่ไพพ์เอาต์พุตของทรี

tree -f | grep filename

นี่คือฟังก์ชันที่คุณสามารถใส่ลงใน. bash_profile หรือ. bashrc ได้

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

-f เป็นทางเลือก
jasonleonhard

10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

type_descriptor ประเภท: -

f: ไฟล์ปกติ

d: ไดเรกทอรี

l: ลิงก์สัญลักษณ์

c: อุปกรณ์อักขระ

b: บล็อกอุปกรณ์


1
ดูเหมือนว่าฉันไม่สามารถใช้ชื่อไฟล์ต่อไปนี้-type typedescriptorได้ ถือเป็นความผิดพลาดหรือไม่?
Allan Nørgaard

5

คุณยังสามารถทำ:

tree | grep filename

สิ่งนี้จะส่งเอาต์พุตของคำสั่ง tree ไปยัง grep สำหรับการค้นหา สิ่งนี้จะบอกคุณได้ว่ามีไฟล์อยู่หรือไม่


3

วิธีที่ง่ายที่สุดคือ

find . | grep test

ที่นี่จะพบรายการไฟล์ทั้งหมดใน (.) เช่นไดเร็กทอรีปัจจุบันแบบวนซ้ำ แล้วมันก็เป็นแค่ grep ธรรมดา ไฟล์ทั้งหมดที่มีชื่อ "test" จะปรากฏขึ้น

คุณสามารถเล่นกับ grep ได้ตามความต้องการของคุณ หมายเหตุ: เนื่องจาก grep เป็นการจัดประเภทสตริงทั่วไปจึงสามารถให้ชื่อไฟล์แก่คุณได้ไม่เพียง แต่ถ้าพา ธ มีไดเร็กทอรี ('/xyz_test_123/other.txt') ก็จะมาถึงชุดผลลัพธ์ด้วย ไชโย


นี้จะได้พบกับสิ่งที่มี "การทดสอบ" ./foo/bar/latest/fred.txtในเส้นทางเช่น
Paul R

โอ้. อันนั้นฉันไม่ได้นึกถึง ขอบคุณสำหรับการกล่าวถึง
sachyy

0

ไม่ grep ทำงานได้ดีสำหรับสิ่งนี้:

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

2
สิ่งนี้ค้นหาเนื้อหาไฟล์สำหรับ "ชื่อไฟล์" จากนั้นพิมพ์ชื่อไฟล์ที่ตรงกัน OP ต้องการชื่อไฟล์ที่ตรงกันไม่ใช่เนื้อหาไฟล์
Matthew

2
ตกลงนี่ไม่ได้ค้นหาชื่อไฟล์ แต่พิมพ์ชื่อไฟล์ที่พบเนื้อหาที่ตรงกัน คุณเข้าใจผิดทั้งตัวเลือก-lและ-Lตัวเลือกมาก
Prometheus

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