Câu trả lời:
ls
không làm khớp mẫu trên tên tệp. Nó chỉ liệt kê nội dung của các thư mục và các tệp mà nó đang được cung cấp dưới dạng đối số.
Shell của bạn, mặt khác có một tính năng gọi là globbing hoặc thế hệ tên tập tin mà mở rộng một mô hình thành một danh sách các tập tin phù hợp với mô hình đó.
Ở đây mô hình toàn cầu sẽ là abc*.zip
( *
là một ký tự đại diện cho bất kỳ số lượng ký tự nào ).
Bạn sẽ chuyển nó tới bất kỳ lệnh nào bạn muốn, chẳng hạn như printf
để in:
printf '%s\n' abc*.zip
Bạn cũng có thể chuyển nó ls -l
để hiển thị các thuộc tính của các tệp đó:
ls -ld abc*.zip
(chúng tôi cần -d
bởi vì nếu bất kỳ tệp nào thuộc loại thư mục , ls
sẽ liệt kê nội dung của chúng theo cách khác).
Hoặc để unzip
giải nén chúng nếu chỉ unzip
có thể trích xuất nhiều hơn một tệp cùng một lúc. Thật không may, nó không có, vì vậy bạn cần sử dụng xargs -n1
hoặc for
lặp:
printf '%s\0' abc*.zip | xargs -r0n1 unzip
Hoặc là:
for file in abc*.zip; do unzip "$file"; done
Nhưng trên thực tế, unzip
giống như một cổng của lệnh MS-DOS, unzip
chính nó sẽ coi đối số của nó là một quả địa cầu. Nói cách khác, unzip 'abc*.zip'
sẽ không giải nén tệp được gọi abc*.zip
( tên tệp hoàn toàn hợp lệ trên Unix, không phải trên hệ điều hành Microsoft), nhưng các tệp khớp với abc*.zip
mẫu, vì vậy bạn thực sự muốn:
unzip 'abc*.zip'
(Trên thực tế xargs
và for
cách tiếp cận của chúng tôi ở trên sẽ sai, vì nếu có một tệp được gọi là abc*.zip
ví dụ, unzip
sẽ coi nó như một mẫu! Xem bsdtar
cách khác để trích xuất zip
tài liệu lưu trữ)
Đối với trường hợp khớp không nhạy cảm, bạn sẽ sử dụng một cách hợp lý [aA][bB][cC]*.[zZ][iI][pP]
. Một số hệ vỏ đã mở rộng toán tử toàn cầu cho trường hợp khớp không nhạy cảm:
zsh
:
setopt extendedglob
ls -ld (#i)abc*.zip
Hoặc là:
ls -ld ((#i)abc)*.zip
nếu bạn chỉ muốn abc
phần không nhạy cảm.
ksh93
:
ls -ld ~(i)abc*.zip
hoặc là:
ls -ld ~(i:abc)*.zip
với bash
.
shopt -s nocaseglob
ls -ld abc*.zip
(không có cách nào để chỉ có các phần của trường hợp ảm đạm nhạy cảm ngoài việc sử dụng cú pháp di động).
với yash
:
set +o case-glob
ls -ld abc*.zip
nhận xét tương tự như bash
trên.
ls abc*.zip
Tuy nhiên, điều này sẽ thất bại nếu có quá nhiều tệp (có giới hạn đối với việc mở rộng shell về số lượng đối số mà nó có thể mở rộng thành).
find . -name "abc*.zip"
Đây có lẽ là phổ quát nhất. Các trích dẫn phải ở đó. Với một số find
triển khai, bạn cũng có thể sử dụng -iname
thay vì -name
tìm kiếm không phân biệt chữ hoa chữ thường ( aBc<date>.ZIP
cũng phù hợp).
ls | grep -x "abc.*\.zip"
Lưu ý .*
và \.
vì bộ lọc grep sử dụng là regex khác với ký hiệu ký tự đại diện mà shell sử dụng để mở rộng. Sử dụng grep -i
cho trường hợp tìm kiếm không nhạy cảm.
execve()
cuộc gọi hệ thống.
find
sẽ tìm kiếm các tệp đó trong thư mục con. Sử dụng find . ! -name . -prune -name 'abc*.zip' -print
hoặc find . -maxdepth 1 -name 'abc*.zip'
nếu các find
hỗ trợ của bạn -maxdepth
như trên GNU hoặc BSD hoặc find . -depth 1 -name 'abc*.zip'
nếu find
hỗ trợ của bạn -depth <n>
giống như trên một số BSD để hạn chế thư mục hiện tại.
$ ls ../*.a
làm việc cho tôi (danh sách lưu trữ trong thư mục cha mẹ).
Bạn phải chỉ định thư mục nơi ls
sẽ tìm kiếm trong một ví dụ
ls -la ~/file*.*
ls -la ./file*.*
nó hoạt động với tôi, nhưng rõ ràng nó không hỗ trợ tìm kiếm theo mẫu
abc
và kết thúc bằng .zip
.
ls -1 | grep "abc$(your_date).zip"
?