ใน bash ฉันต้องการส่งคืนชื่อไฟล์ (และพา ธ ไปยังไฟล์) สำหรับไฟล์ทุกประเภท.php|.html|.jsที่มีสตริงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่"document.cookie" | "setcookie"
ฉันจะทำอย่างไร
ใน bash ฉันต้องการส่งคืนชื่อไฟล์ (และพา ธ ไปยังไฟล์) สำหรับไฟล์ทุกประเภท.php|.html|.jsที่มีสตริงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่"document.cookie" | "setcookie"
ฉันจะทำอย่างไร
คำตอบ:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
การrตั้งค่าสถานะหมายถึงการค้นหาซ้ำ (ไดเรกทอรีย่อยการค้นหา) iธงหมายถึงกรณีตาย
หากคุณต้องการให้ชื่อไฟล์เพิ่มแฟlล็ก (ตัวพิมพ์เล็กL):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
grep -E ... >egrep ...
grep: (error|fail): No such file or directoryบน Ubuntu Desktop 16; คำใบ้ใด ๆ
--include=\*.{php,html,js}
ลองสิ่งที่ชอบ grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
-iทำให้กรณี insensitlve
.ที่หมายถึงการสิ้นสุดที่คุณต้องการที่จะเริ่มต้นจากไดเรกทอรีปัจจุบันของคุณนี้อาจจะแทนที่ด้วยไดเรกทอรีใด ๆ
-rวิธีการทำเช่นนี้ซ้ำขวาลงต้นไม้ไดเรกทอรี
-nพิมพ์หมายเลขบรรทัดสำหรับการแข่งขัน
--includeช่วยให้คุณเพิ่มชื่อไฟล์นามสกุล ยอมรับสัญลักษณ์แทน
สำหรับข้อมูลเพิ่มเติมดู: http://www.gnu.org/software/grep/
-lตัวเลือก (เพียงพิมพ์ชื่อไฟล์ที่ตรงกัน) แทน-n
findพวกเขาและgrepสำหรับสตริง:
นี้จะได้พบกับไฟล์ทั้งหมด 3 ประเภทใน / เริ่มต้น / เส้นทางและ grep '(document\.cookie|setcookie)'สำหรับการแสดงออกปกติ แยก 2 บรรทัดด้วยแบ็กสแลชเพื่อความสะดวกในการอ่าน ...
find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
xargs egrep -i '(document\.cookie|setcookie)'
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dirในไดเรกทอรี weigth ~ 500Gb
เสียงเหมือนงานที่สมบูรณ์แบบสำหรับgrepหรือบางทีอาจจะแอ๊กชั่น
หรือการก่อสร้างที่ยอดเยี่ยมนี้:
find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
-exec grep...ดีกว่าxargsวิธีการของฉันเพราะจะไม่ทำให้หายใจไม่ออกในช่องว่างในชื่อไฟล์
find . -type f -print0 | xargs -0 -I {} grep "search_string" {}คุณสามารถใช้มันเช่นนี้จะจัดการกับช่องว่างในชื่อไฟล์: แน่นอนตัวเลือกอื่น ๆ สามารถเพิ่มได้เช่นกัน
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'
เพียงเพื่อรวมอีกหนึ่งทางเลือกคุณสามารถใช้สิ่งนี้:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
ที่ไหน:
-regextype posix-extendedบอกfindชนิดของ regex ที่คาดหวัง-regex "^.*\.(php|html|js)$"บอกว่าfindชื่อไฟล์ของ regex ต้องตรงกัน-exec grep -EH '(document\.cookie|setcookie)' {} \;บอกfindให้รันคำสั่ง (พร้อมตัวเลือกและอาร์กิวเมนต์) ที่ระบุระหว่าง-execตัวเลือกและ\;สำหรับแต่ละไฟล์ที่ค้นหาโดยที่{}แสดงถึงตำแหน่งของพา ธ ไฟล์ในคำสั่งนี้
ในขณะที่
Eตัวเลือกบอกgrepให้ใช้ Extended Regex (เพื่อสนับสนุนวงเล็บ) และ ...Hตัวเลือกบอกgrepให้พิมพ์เส้นทางไฟล์ก่อนการแข่งขันและด้วยเหตุนี้หากคุณต้องการเส้นทางของไฟล์คุณสามารถใช้:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u
ที่ไหน
|[ท่อ] ส่งผลลัพธ์ของfindคำสั่งต่อไปหลังจากนี้ (ซึ่งเป็นsedแล้วsort)rตัวเลือกบอกsedให้ใช้เสริม regexs/HI/BYE/บอกsedให้แทนที่ทุกการเกิดขึ้นครั้งแรก (ต่อบรรทัด) ของ "HI" ด้วย "BYE" และ ...s/(^.*):.*$/\1/บอกให้แทนที่ regex (^.*):.*$(หมายถึงกลุ่ม [สิ่งที่ล้อมรอบด้วย()] รวมถึงทุกอย่าง [ .*= หนึ่งตัวอักษรหรือมากกว่า] จากจุดเริ่มต้นของบรรทัด [ ^] จนถึง 'แรก': 'ตามด้วยอะไรจนถึง' จุดสิ้นสุดของ บรรทัด [ $]) โดยกลุ่มแรก[ \1] ของ regex ที่แทนที่uบอก sort เพื่อลบรายการที่ซ้ำกัน (ใช้sort -uเป็นทางเลือก)... ไกลจากการเป็นวิธีที่สง่างามที่สุด ดังที่ฉันพูดความตั้งใจของฉันคือการเพิ่มช่วงของความเป็นไปได้ (และเพื่อให้คำอธิบายที่สมบูรณ์ยิ่งขึ้นเกี่ยวกับเครื่องมือบางอย่างที่คุณสามารถใช้ได้)