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 đó?
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:
Đơ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 f
chỉ 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 2013
nếu 2013
trướ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éphane2013
tệ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 find
trong miền địa phương C:
LC_ALL=C find . ! -name '*2013*'
Các mẫu tên tệp Ksh là đủ:
# files with 2013
ls -d -- *2013*
# files without 2013
ls -d -- !(*2013*)
Nếu shell của bạn bị bash, bạn cần chạy shopt -s extglob
trướ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, ls
có 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
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
ls
sẽ 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ằngksh
sẽ sắp xếp danh sách.