ใน 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
เป็นทางเลือก)... ไกลจากการเป็นวิธีที่สง่างามที่สุด ดังที่ฉันพูดความตั้งใจของฉันคือการเพิ่มช่วงของความเป็นไปได้ (และเพื่อให้คำอธิบายที่สมบูรณ์ยิ่งขึ้นเกี่ยวกับเครื่องมือบางอย่างที่คุณสามารถใช้ได้)