ค้นหาชื่อไฟล์ที่ไม่ได้ลงท้ายด้วยส่วนขยายเฉพาะบน Unix หรือไม่


207

มีวิธีง่ายๆในการค้นหาไฟล์ทั้งหมดซ้ำในลำดับชั้นไดเรกทอรีซ้ำซึ่งไม่ได้จบในรายการส่วนขยายหรือไม่? เช่นไฟล์ทั้งหมดที่ไม่ใช่ * .dll หรือ * .exe

ค้นหา UNIX / GNU ที่ทรงพลังเหมือนไม่มีexcludeโหมด (หรือฉันพลาด) และฉันมักจะพบว่ามันยากที่จะใช้นิพจน์ทั่วไปเพื่อค้นหาสิ่งที่ไม่ตรงกับนิพจน์เฉพาะ .

ฉันอยู่ในสภาพแวดล้อม Windows (ใช้พอร์ตGnuWin32ของเครื่องมือ GNU ส่วนใหญ่) ดังนั้นฉันจึงเปิดกว้างสำหรับโซลูชันที่ใช้ Windows เท่านั้น

คำตอบ:


343

หรือไม่(และต้องการที่จะหลบหนี:

find . -not -name "*.exe" -not -name "*.dll"

และเพื่อแยกรายการของไดเรกทอรี

find . -not -name "*.exe" -not -name "*.dll" -not -type d

หรือในเชิงบวกตรรกะ ;-)

find . -not -name "*.exe" -not -name "*.dll" -type f

6
-notสามารถถูกแทนที่ด้วย'!'(ขอแนะนำอ้าง) บนมืออื่น ๆ ที่-nameเป็นกรณีในขณะที่มีความสำคัญ-inameเป็นกรณีตาย
Ivan Chau


8
$ find . -name \*.exe -o -name \*.dll -o -print

ตัวเลือกสองชื่อแรกไม่มีตัวเลือกพิมพ์จึงข้ามไป ทุกอย่างอื่นถูกพิมพ์


4

คุณสามารถทำบางสิ่งโดยใช้คำสั่ง grep:

find . | grep -v '(dll|exe)$'

การ-vตั้งค่าสถานะgrepโดยเฉพาะหมายถึง "ค้นหาสิ่งที่ไม่ตรงกับนิพจน์นี้"


6
grep -v '\. (dll | exe) $' จะป้องกันการจับคู่กับไฟล์หรือ dir ชื่อ "dexe" ตัวอย่างเช่น
drAlberT

ใช้งานได้กับ regexp แบบขยายเท่านั้น ฉันต้องเพิ่ม -E (หรือใช้ egrep) เพื่อทำให้งานนี้
joctee

2

อีกหนึ่ง :-)

$ ls -ltr
รวม 10
-rw-r - r-- 1 scripter linuxdumb 47 Dec 23 14:46 test1
-rw-r - r-- 1 scripter linuxdumb 0 Jan 4 23:40 test4
-rw-r - r-- 1 scripter linuxdumb 0 ม.ค. 4 23:40 ทดสอบ 3
-rw-r - r-- 1 scripter linuxdumb 0 ม.ค. 4 23:40 ทดสอบ 2
-rw-r - r-- 1 scripter linuxdumb 0 ม.ค. 4 23:41 file5
-rw-r - r-- 1 scripter linuxdumb 0 ม.ค. 4 23:41 file4
-rw-r - r-- 1 scripter linuxdumb 0 ม.ค. 4 23:41 file3
-rw-r - r-- 1 scripter linuxdumb 0 ม.ค. 4 23:41 file2
-rw-r - r-- 1 scripter linuxdumb 0 ม.ค. 4 23:41 file1
$ ค้นหา - ประเภท f! -name "* 1"! -name "* 2" - พิมพ์
./test3
./test4
./file3
./file4
./file5
$

Unix find การอ้างอิงคำสั่ง



1

Linux / OS X:

เริ่มต้นจากไดเรกทอรีปัจจุบันค้นหาไฟล์ทั้งหมดที่ลงท้ายด้วย. dll หรือ. exe ซ้ำ

find . -type f | grep -P "\.dll$|\.exe$"

เริ่มต้นจากไดเรกทอรีปัจจุบันค้นหาไฟล์ทั้งหมดซ้ำที่ไม่สิ้นสุดใน. dll หรือ. exe

find . -type f | grep -vP "\.dll$|\.exe$"

หมายเหตุ:

(1) ตัวเลือก P ใน grep ระบุว่าเรากำลังใช้สไตล์ Perl เพื่อเขียนนิพจน์ปกติของเราที่จะใช้ร่วมกับคำสั่งgrep เพื่อวัตถุประสงค์ในการใช้คำสั่งgrepร่วมกับการแสดงออกปกติฉันพบว่าสไตล์ Perl เป็นสไตล์ที่ทรงพลังที่สุด

(2) ตัวเลือก v ใน grep สั่งให้เชลล์แยกไฟล์ใด ๆ ที่เป็นไปตามนิพจน์ทั่วไป

(3) อักขระ $ ที่ท้ายคำว่า ".dll $" เป็นอักขระควบคุมตัวคั่นที่บอกเชลล์ว่าสตริงชื่อไฟล์ลงท้ายด้วย ".dll"


0

โซลูชันอื่น ๆ ในหน้านี้ไม่พึงประสงค์หากคุณมีรายการส่วนขยายที่ยาว - การรักษาลำดับที่ยาวนานของ-not -name 'this' -not -name 'that' -not -name 'other'จะน่าเบื่อและเกิดข้อผิดพลาดได้ง่ายหรือหากการค้นหาเป็นแบบโปรแกรมและรายการส่วนขยายถูกสร้างขึ้นที่รันไทม์

สำหรับสถานการณ์เหล่านั้นทางออกที่ชัดเจนยิ่งขึ้นในการแยกข้อมูล (รายการส่วนขยาย) และรหัส (พารามิเตอร์ถึงfind) อาจเป็นที่ต้องการ รับโครงสร้างไดเรกทอรีและไฟล์ที่มีลักษณะเช่นนี้:

.
└── a
    ├── 1.txt
    ├── 15.xml
    ├── 8.dll
    ├── b
    │   ├── 16.xml
    │   ├── 2.txt
    │   ├── 9.dll
    │   └── c
    │       ├── 10.dll
    │       ├── 17.xml
    │       └── 3.txt
    ├── d
    │   ├── 11.dll
    │   ├── 18.xml
    │   ├── 4.txt
    │   └── e
    │       ├── 12.dll
    │       ├── 19.xml
    │       └── 5.txt
    └── f
        ├── 13.dll
        ├── 20.xml
        ├── 6.txt
        └── g
            ├── 14.dll
            ├── 21.xml
            └── 7.txt

คุณสามารถทำสิ่งนี้:

## data section, list undesired extensions here
declare -a _BADEXT=(xml dll)

## code section, this never changes
BADEXT="$( IFS="|" ; echo "${_BADEXT[*]}" | sed 's/|/\\|/g' )"
find . -type f ! -regex ".*\.\($BADEXT\)"

ซึ่งผลลัพธ์ใน:

./a/1.txt
./a/b/2.txt
./a/b/c/3.txt
./a/d/4.txt
./a/d/e/5.txt
./a/f/6.txt
./a/f/g/7.txt

คุณสามารถเปลี่ยนรายการส่วนขยายโดยไม่เปลี่ยนบล็อคโค้ด

หมายเหตุใช้ไม่ได้กับ OSX เนทิฟfind- ใช้ gnu find แทน

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