liệt kê các tệp có mẫu bắt đầu và kết thúc


9

Tôi muốn liệt kê tất cả các tệp trong một thư mục bắt đầu bằng 'abc' và kết thúc bằng '.zip'

Tôi đang cố gắng sử dụng ls.

Thư mục có rất nhiều tệp zip bắt đầu bằng abc<date>xvz<date>. Tôi chỉ muốn có được danh sáchabc<date>.zip


ls -1 | grep "abc$(your_date).zip" ?
Stan Strum

Câu trả lời:


15

lskhô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 -dbởi vì nếu bất kỳ tệp nào thuộc loại thư mục , lssẽ liệt kê nội dung của chúng theo cách khác).

Hoặc để unzipgiải nén chúng nếu chỉ unzipcó 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 -n1hoặc forlặ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ế, unzipgiống như một cổng của lệnh MS-DOS, unzipchí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*.zipmẫu, vì vậy bạn thực sự muốn:

 unzip 'abc*.zip'

(Trên thực tế xargsforcá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*.zipví dụ, unzipsẽ coi nó như một mẫu! Xem bsdtarcách khác để trích xuất ziptà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 abcphầ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ư bashtrên.


9
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ố findtriển khai, bạn cũng có thể sử dụng -inamethay vì -nametìm kiếm không phân biệt chữ hoa chữ thường ( aBc<date>.ZIPcũng phù hợp).

ls | grep -x "abc.*\.zip"

Lưu ý .*\.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 -icho trường hợp tìm kiếm không nhạy cảm.


1
Lưu ý rằng giới hạn đó không phải là giới hạn vỏ. Đó là một giới hạn hạt nhân trong execve()cuộc gọi hệ thống.
Stéphane Chazelas

Có lẽ nên lưu ý rằng findsẽ tìm kiếm các tệp đó trong thư mục con. Sử dụng find . ! -name . -prune -name 'abc*.zip' -printhoặc find . -maxdepth 1 -name 'abc*.zip'nếu các findhỗ trợ của bạn -maxdepthnhư trên GNU hoặc BSD hoặc find . -depth 1 -name 'abc*.zip'nếu findhỗ 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.
Stéphane Chazelas

$ ls ../*.alàm việc cho tôi (danh sách lưu trữ trong thư mục cha mẹ).
Daniel

0

Hãy thử sử dụng ls abc*.zipđể thu hẹp kết quả theo các tiêu chí phù hợp với tiêu chí của bạn cho chuỗi abc bắt đầu và kết thúc .zip Dấu hoa thị sẽ mở rộng để khớp với các kết quả đó mà không bao gồm các ký tự bắt đầu xvz.


-1

Bạn phải chỉ định thư mục nơi lssẽ 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


1
Điều này không giải quyết câu hỏi; các tập tin nên bắt đầu bằng abcvà kết thúc bằng .zip.
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.