Loại trừ một thư mục trong mẫu phù hợp `ls`


13

Tôi đang cố gắng chuyển các tệp ls.pngtệp bên trong (không cần đệ quy, mặc dù nó sẽ rất hữu ích), ngoại trừ một tệp. Loại trừ một thư mục tức là

ls */*.png

hoạt động tốt

ls (^one)*/*.png

trả về không có thiết bị xuất chuẩn. Làm thế nào để tôi đạt được nó?

Tôi bị mù và dẫn nó đến espeak, vì vậy bây giờ tôi chỉ có thể nghe thấy thiết bị xuất chuẩn.


Bạn đang sử dụng vỏ nào? Mẫu của bạn trông giống như mẫu zsh, mặc dù không phải là mẫu hữu ích vì nó sẽ không loại trừ one(mẫu phù hợp ^one/*.png), nó sẽ in mọi thứ.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


16

Tùy chọn 1 - chỉ sử dụng ls:
Với tính năng mở rộng bash globalbing ( shopt -s extglob) bạn có thể thực hiện:

ls !(one*)/*.png


Tùy chọn 2 - kết hợp lsgrep:

Bạn có thể kết hợp lsvớigrep -v

  • ví dụ ls */*.png | grep -v "one/"


Tùy chọn 3 - (IMO tốt nhất) nhưng findkhông sử dụng ls:

Để tìm kiếm đệ quy tất cả các thư mục con sử dụng find

find . -type f -name "*.png" -not -path "*/one/*"


Tất cả các lớp trên sẽ liệt kê các thư mục với .pngcác tệp trong khi lọc ra bất kỳ đường dẫn nào khớp one/; Chỉ có lựa chọn 3 sẽ làm điều này một cách đệ quy.


Không phải findlệnh cần phải nói -path "*/one/*"hay -path "./one/*"sao?
G-Man nói 'Phục hồi Monica'

@ G-Man Bạn hoàn toàn đúng. Đã chỉnh sửa ở trên.
toxefa

Điều đó vẫn ./phone/handset.pngkhông phù hợp ?
G-Man nói 'Phục hồi Monica'

@ G-Man Có gì sai với kết hợp .pngs trong một thư mục được gọi phone? Tôi nghĩ rằng chúng tôi chỉ đang cố gắng để loại trừ one?
toxefa

1
Chà, vì bạn đang sử dụng nó cùng với -notnó, điều đó có nghĩa là nó gây ra findloại trừ các tệp trong một thư mục được gọi phone.
G-Man nói 'Phục hồi Monica'

6

Trong zsh , đặt setopt extended_globtrong của bạn ~/.zshrc. Sau đó, bạn có thể sử dụng mẫu ký tự đại diện ^one để loại trừ thư mục được gọi one.

ls ^one/*.png

Nếu bạn muốn **/đệ quy vào các thư mục con, hãy sử dụng cho Globing đệ quy. Để loại trừ thư mục được gọi onetại toplevel, cũng như thư mục toplevel:

ls ^one/**/*.png

Để loại trừ các tệp trong thư mục con được gọi one, nhưng không loại trừ các tệp trong thư mục con của nó:

ls **/^one/*.png

Để loại trừ các tệp trong thư mục con được gọi oneở mọi cấp độ, hãy sử dụng mẫu lặp lại với #toán tử xung quanh phủ định:

ls (^one/)#/*.png
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.