Tìm tên tệp không chứa chuỗi đã chỉ định


19

Tôi muốn thực hiện ngược lại:

find . -name "*2013*"

Tìm tất cả các tệp trong thư mục hiện tại không chứa chuỗi "2013" trong tên của chúng. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


28

Đơn giản:

find . ! -name '*2013*'

Thêm một ! -type dđể loại trừ các tệp của thư mục loại (như .chính nó) hoặc -type fchỉ bao gồm các tệp thông thường , ngoại trừ tất cả các loại tệp khác (thư mục, fifos, symlink, thiết bị, ổ cắm ...).

Tuy nhiên, coi chừng *phù hợp với một chuỗi từ 0 ký tự trở lên . Vì vậy, nó có thể báo cáo tên tệp có chứa 2013nếu 2013trước đó hoặc theo sau bởi một cái gì đó không thể được giải mã đầy đủ dưới dạng các ký tự hợp lệ trong miền địa phương hiện tại.

Điều đó có thể xảy ra nếu bạn đang ở một địa điểm nơi các ký tự có thể được mã hóa trên nhiều byte (như trong UTF-8) cho các tên tệp được mã hóa theo một mã hóa khác. Chẳng hạn, trong ngôn ngữ UTF-8, nó sẽ báo cáo một Stéphane2013tệp nếu nó éđã được mã hóa trong bộ ký tự iso8859-15 (dưới dạng byte 0xe9).

Tốt nhất là đảm bảo tên tệp được mã hóa trong bộ ký tự của miền địa phương, nhưng nếu bạn không thể đảm bảo, thì một công việc xung quanh là chạy findtrong miền địa phương C:

LC_ALL=C find . ! -name '*2013*'

4

Các mẫu tên tệp Ksh là đủ:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

Tài liệu tham khảo

Nếu shell của bạn bị bash, bạn cần chạy shopt -s extglobtrước khi bạn có thể sử dụng mẫu này (bạn có thể đặt nó vào trong .bashrc). Nếu shell của bạn là zsh, bạn cần chạy setopt ksh_glob(bạn có thể đặt nó vào trong .zshrc). Zsh cũng cung cấp ls -d -- ^*2013*, trong đó yêu cầu sơ bộ setopt extended_glob.

Tùy thuộc vào những gì bạn đang làm với các tên tệp này, lscó thể không phải là lệnh đúng để sử dụng. Để lưu trữ chúng trong một mảng

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

4
Điều đó không tái diễn trong các thư mục con và sẽ bỏ qua các tệp chấm mặc dù (và lssẽ trả về một thông báo lỗi nếu mẫu không khớp với bất kỳ tệp nào). Cũng lưu ý rằng kshsẽ sắp xếp danh sách.
Stéphane Chazelas

-1

Tìm tất cả các tệp trong thư mục hiện tại không chứa một chuỗi nhất định, tại đây "2013":

find . ! -name "*2013*" -type f

2
Điều này về cơ bản giống như unix.stackexchange.com/a/102614/117549 từ 3 ​​năm trước, ngoại trừ bạn đã thêm "-f" khiến điều này trở thành một câu trả lời tồi tệ hơn.
Jeff Schaller
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.