ฉันต้องการค้นหาไฟล์ในไดเรกทอรีปัจจุบันที่มีข้อความ "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 {} \;
- มันจะพิมพ์ชื่อไฟล์ของไฟล์ที่ตรงกับสิ่งอื่น