ฉันต้องการค้นหาไฟล์ในไดเรกทอรีปัจจุบันที่มีข้อความ "chrome"
$ find . -exec grep chrome
find: missing argument to `-exec'
ผมทำอะไรผิดหรือเปล่า?
find: Only one instance of {} is supported with -exec ... +
-execกับfind
ฉันต้องการค้นหาไฟล์ในไดเรกทอรีปัจจุบันที่มีข้อความ "chrome"
$ find . -exec grep chrome
find: missing argument to `-exec'
ผมทำอะไรผิดหรือเปล่า?
find: Only one instance of {} is supported with -exec ... +
-execกับfind
คำตอบ:
คุณพลาด a ;(หลบหนีมาที่นี่\;เพื่อป้องกันเชลล์จากการตีความ) หรือ a +และ a {}:
find . -exec grep chrome {} \;
หรือ
find . -exec grep chrome {} +
findจะดำเนินการgrepและจะแทนที่{}ด้วยชื่อไฟล์ที่พบ ความแตกต่างระหว่าง;และ+คือด้วยคำสั่ง;เดียวgrepสำหรับแต่ละไฟล์จะถูกดำเนินการในขณะที่มี+ไฟล์มากที่สุดเท่าที่เป็นไปได้จะได้รับเป็นพารามิเตอร์grepในครั้งเดียว
grep -lsภายในการค้นหาโครงสร้าง
find . -exec grep foo {} +จะแสดงผลลัพธ์เช่นนี้./dir/file.py:from foo import bar
find . -exec grep foo {} \;จะแสดงผลลัพธ์เช่นนี้from foo import bar
find . -exec grep -l foo {} +จะแสดงผลลัพธ์เช่นนี้./dir/file.py
find . -exec grep -l foo {} \;จะแสดงผลลัพธ์เช่นนี้./dir/file.py
คุณไม่จำเป็นต้องใช้findสิ่งนี้เลย grep สามารถจัดการการเปิดไฟล์ได้จากรายการ glob ของทุกสิ่งในไดเรกทอรีปัจจุบัน:
grep chrome *
... หรือแม้แต่เรียกซ้ำสำหรับโฟลเดอร์และทุกสิ่งภายใต้:
grep chrome . -R
findเมื่อgrepสามารถทำงานได้ แต่ในบางกรณีมันจะมีประสิทธิภาพมากกว่าที่จะใช้ find เพื่อปรับรายชื่อไฟล์ก่อนออกไปข้างนอก เพื่อ grep
grepไม่ทำให้หายใจไม่ออกในกรณีเช่นexecนี้
find . | xargs grep 'chrome'
คุณสามารถทำได้:
find . | xargs grep 'chrome' -ls
ครั้งแรกจะแสดงบรรทัดในไฟล์ที่สองเพียงแสดงรายการไฟล์
ตัวเลือกของ Caleb คือ neater กดแป้นน้อยลง
xargsมันคือมันคาดว่าอินพุตจะถูกยกมาในรูปแบบที่แปลกประหลาดที่findไม่ได้ผลิต ดังนั้นไม่ทำงานถ้าคุณมีชื่อไฟล์ที่มีช่องว่างหรือfind … | xargs … \'"
find . | xargs -n1 -iX grep "X" 'chrome'เพื่อให้ข้อโต้แย้งได้รับการป้อนครั้งละหนึ่งรายการและเสนอราคา เห็นได้ชัดว่านี่เป็นวิธีที่ไม่มีประสิทธิภาพในการจัดการกับตัวอย่างนี้ แต่สำหรับบางสถานการณ์มันก็ดี
xargsจัดการกับชื่อไฟล์ Linux คือการfind ... -print0 | xargs -0ใช้ NUL เป็นตัวคั่น ทางเลือก - การxargs -d '\n'ใช้บรรทัดใหม่เป็นตัวคั่นความน่าเชื่อถือ 99%
การค้นหาเป็นวิธีหนึ่งและคุณสามารถลองได้the_silver_searcherสิ่งที่คุณต้องทำคือ
ag chrome
มันจะค้นหาโครเมี่ยมในไฟล์ทั้งหมด (รวมถึงไดเรกทอรีย่อย) และมันเร็วกว่าการค้นหา
หากต้องการดูรายการไฟล์แทนบรรทัด:
grep -l "chrome" *
หรือ:
grep -r -l "chrome" .
นี่คือตัวอย่างของวิธีที่ฉันใช้ find / exec ...
find . -name "*.py" -print -exec fgrep hello {} \;
การค้นหานี้จะวนซ้ำสำหรับไฟล์. py ทั้งหมดและสำหรับแต่ละไฟล์จะพิมพ์ชื่อไฟล์และ fgrep สำหรับ 'hello' ในไฟล์นั้น (สำหรับแต่ละไฟล์) ผลลัพธ์ดูเหมือนว่า (วิ่งแค่วันนี้):
./r1.py
./cgi-bin/tst1.py
print "hello"
./app/__init__.py
./app/views.py
./app/flask1.py
./run.py
./tst2.py
print "hello again"
find . -name "*.py" -exec fgrep -l hello {} \; - มันจะพิมพ์ชื่อไฟล์ของไฟล์ที่ตรงกับสิ่งอื่น