tìm tên tệp KHÔNG kết thúc trong các phần mở rộng cụ thể trên Unix?


207

Có một cách đơn giản để tìm đệ quy tất cả các tệp trong hệ thống phân cấp thư mục, không kết thúc trong danh sách các tiện ích mở rộng? Ví dụ: tất cả các tệp không * * hoặc * .exe

UNIX / GNU tìm thấy, mạnh mẽ như vậy, dường như không có excludechế độ (hoặc tôi thiếu nó) và tôi luôn cảm thấy khó sử dụng các biểu thức thông thường để tìm những thứ không khớp với một biểu thức cụ thể .

Tôi đang ở trong môi trường Windows (sử dụng cổng GnuWin32 của hầu hết các công cụ GNU), vì vậy tôi cũng mở cho các giải pháp chỉ dành cho Windows.

Câu trả lời:


343

Hoặc không có (và cần phải thoát khỏi nó:

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

và cũng loại trừ danh sách các thư mục

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

hoặc theo logic tích cực ;-)

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

6
-notcó thể được thay thế bằng '!'(Trích dẫn được khuyến nghị). Mặt khác, -nametrường hợp nhạy cảm trong khi -inametrường hợp không nhạy cảm.
Ivan Châu

45
find . ! \( -name "*.exe" -o -name "*.dll" \)

2
Trên Solaris -notlà một lựa chọn tồi, ứng dụng này !hoạt động tốt :)
DmitrySandalov

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

Các tùy chọn hai tên đầu tiên không có tùy chọn không có dấu, vì vậy chúng bỏ qua. Mọi thứ khác được in.


4

Bạn có thể làm gì đó bằng lệnh grep:

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

Các -vcờ trên grepđặc biệt có nghĩa là "tìm thấy những điều đó không phù hợp với biểu thức này."


6
grep -v '\. (dll | exe) $' sẽ ngăn việc khớp với một tệp hoặc thư mục có tên "dexe" chẳng hạn
drAlberT

Điều này chỉ hoạt động với regrec mở rộng. Tôi đã phải thêm -E (hoặc sử dụng egrep) để thực hiện công việc này.
joctee

2

một lần nữa :-)

$ ls -ltr
tổng số 10
-rw-r - r-- 1 scripter linuxdumb 47 tháng 12 23 14:46 test1
-rw-r - r-- 1 scripter linuxdumb 0 tháng 1 4 23:40 test4
-rw-r - r-- 1 scripter linuxdumb 0 tháng 1 4 23:40 test3
-rw-r - r-- 1 scripter linuxdumb 0 tháng 1 4 23:40 test2
-rw-r - r-- 1 scripter linuxdumb 0 tháng 1 4 23:41 file5
-rw-r - r-- 1 scripter linuxdumb 0 tháng 1 4 23:41 file4
-rw-r - r-- 1 scripter linuxdumb 0 tháng 1 4 23:41 file3
-rw-r - r-- 1 scripter linuxdumb 0 tháng 1 4 23:41 file2
-rw-r - r-- 1 scripter linuxdumb 0 tháng 1 4 23:41 file1
$ tìm. -type f! -tên "* 1"! -name "* 2" -print
./test3
./test4
./file3
./file4
./file5
$

Unix tìm tài liệu tham khảo lệnh


1
find  /data1/batch/source/export   -type f -not  -name "*.dll" -not -name "*.exe"

1

Linux / OS X:

Bắt đầu từ thư mục hiện tại, đệ quy tìm tất cả các tệp kết thúc bằng dll hoặc .exe

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

Bắt đầu từ thư mục hiện tại, hãy tìm đệ quy tất cả các tệp KHÔNG kết thúc bằng dll hoặc .exe

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

Ghi chú:

(1) Tùy chọn P trong grep chỉ ra rằng chúng ta đang sử dụng kiểu Perl để viết các biểu thức chính quy được sử dụng cùng với lệnh grep . Với mục đích thực hiện lệnh grep kết hợp với các biểu thức thông thường, tôi thấy rằng kiểu Perl là kiểu mạnh nhất xung quanh.

(2) Tùy chọn v trong grep hướng dẫn shell loại trừ bất kỳ tệp nào thỏa mãn biểu thức chính quy

(3) Ký tự $ ở cuối câu "dll $" là ký tự điều khiển dấu phân cách cho lớp vỏ rằng chuỗi tên tệp kết thúc bằng "dll"


0

Các giải pháp khác trên trang này không được mong muốn nếu bạn có một danh sách dài các tiện ích mở rộng - việc duy trì một chuỗi dài -not -name 'this' -not -name 'that' -not -name 'other'sẽ rất tẻ nhạt và dễ bị lỗi - hoặc nếu tìm kiếm có lập trình và danh sách các tiện ích mở rộng được xây dựng khi chạy.

Đối với những tình huống đó, một giải pháp phân tách rõ ràng hơn dữ liệu (danh sách các tiện ích mở rộng) và mã (các tham số đến find) có thể được mong muốn. Đưa ra một cấu trúc thư mục và tập tin trông như thế này:

.
└── 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

Bạn có thể làm một cái gì đó như thế này:

## 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\)"

Kết quả nào trong:

./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

Bạn có thể thay đổi danh sách tiện ích mở rộng mà không thay đổi khối mã.

LƯU Ý không hoạt động với OSX gốc find- thay vào đó hãy sử dụng gnu find.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.