Kecualikan satu direktori dalam pola `ls` yang cocok


13

Saya mencoba untuk lsdirs yang memiliki .pngfile di dalamnya (tidak perlu untuk recursiveness, meskipun itu akan sangat berguna), kecuali satu. Keluarkan satu direktori yaitu

ls */*.png

bekerja dengan baik.

ls (^one)*/*.png

tidak mengembalikan stdout. Bagaimana saya mencapainya?

Saya buta dan menyalurkannya espeak, jadi saya hanya bisa mendengar stdout untuk saat ini.


Shell mana yang Anda gunakan? Pola Anda terlihat seperti pola zsh, meskipun bukan yang bermanfaat karena tidak akan dikecualikan one(pola yang tepat adalah ^one/*.png), itu akan mencetak semuanya.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:


16

Opsi 1 - hanya menggunakan ls:
Dengan bash globbing diperpanjang dinyalakan ( shopt -s extglob) Anda dapat melakukan:

ls !(one*)/*.png


Opsi 2 - menggabungkan lsdan grep:

Anda dapat menggabungkan lsdengangrep -v

  • misalnya ls */*.png | grep -v "one/"


Opsi 3 - (IMO terbaik) tetapi findtidak menggunakan ls:

Untuk pencarian rekursif semua subdirektori menggunakan find

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


Semua kalimat di atas akan daftar direktori dengan .pngfile sambil menyaring semua jalan yang cocok one/; hanya Opsi 3 yang akan melakukan ini secara rekursif.


Bukankah findperintah itu perlu diucapkan -path "*/one/*"atau -path "./one/*"?
G-Man Mengatakan 'Reinstate Monica'

@ G-Man Anda benar sekali. Diedit di atas.
toxefa

Bukankah itu masih cocok ./phone/handset.png?
G-Man Mengatakan 'Reinstate Monica'

@ G-Man Apa yang salah dengan pencocokan .pngdi direktori bernama phone? Saya pikir kami hanya mencoba untuk mengecualikan one?
toxefa

1
Nah, karena Anda menggunakannya dalam hubungannya dengan -not, itu berarti menyebabkan finduntuk mengecualikan file dalam direktori yang disebut phone.
G-Man Mengatakan 'Reinstate Monica'

6

Dalam zsh , menempatkan setopt extended_globdi Anda ~/.zshrc. Kemudian Anda dapat menggunakan pola wildcard ^one untuk mengecualikan direktori yang disebut one.

ls ^one/*.png

Jika Anda ingin rekursi menjadi subdirektori, gunakan **/untuk globbing rekursif. Untuk mengecualikan direktori yang disebut onedi tingkat atas, serta direktori tingkat atas:

ls ^one/**/*.png

Untuk mengecualikan file dalam subdirektori yang dipanggil one, tetapi tidak file dalam subdirektori itu:

ls **/^one/*.png

Untuk mengecualikan file di bawah subdirektori yang dipanggil onedi tingkat mana pun, gunakan pola berulang dengan #operator di sekitar negasi:

ls (^one/)#/*.png
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.