Daftar file yang cocok dengan pola tetapi abaikan file yang cocok dengan pola lain?


12

Katakanlah saya memiliki direktori dengan file a1, a2, a3, b1, b2, b3. Saya hanya ingin mencocokkan file yang dimulai dengan atetapi tidak mengandung 3. Saya mencoba ls -I "*3" *a*tetapi kembali a1 a2 a3, meskipun saya tidak ingin itu cocok a3. Apakah ini mungkin ls?


set jawaban yang beragam dan menarik di sini, tetapi penjelasan mengapa ls -I '* 3' a * gagal akan diperbaiki. dan / atau mengapa daftar globbed shell tidak kemudian disaring oleh sakelar abaikan ke ls?
Theophrastus

Halaman manual mengatakan tentang opsi -I:, do not list implied entries matching shell PATTERNnamun tidak menjelaskan apa yang dimaksud dengan tersirat , tapi saya kira itu hanya berlaku untuk file yang lsdidapat dengan ekspansi glob - dan lstidak memperluas a*, shell melakukan itu .
Murray Jensen

Jawaban:


14

Hanya:

shopt -s extglob  
ls a!(*3*)
  • shopt -s extglob mengaktifkan globbing diperpanjang.
  • a cocok dengan awal a
  • !()meniadakan pertandingan di dalam ()...
    • *3*yang 3dan apa pun sebelum atau sesudahnya.

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls a!(*3*)
a1  a2  a2a  aa1  aa2

1
FYI, membutuhkanset -s extglob
Brian

@ Brian Yea, perhatikan saja ^^
kekacauan

8

Jawaban yang ada dengan baik menyatakan cara terbaik untuk melakukan ini dengan gumpalan; Saya akan memasukkan ini karena dalam kebanyakan kasus, findadalah pilihan yang lebih baik jika Anda ingin melakukan skrip atau pemrosesan lebih lanjut:

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

Anda dapat memberi makan jawaban xargsuntuk tindakan mudah, atau ke while readlingkaran untuk hal-hal yang lebih rumit.


4

Cara yang mudah adalah

  • untuk membuat daftar semua file yang cocok a*
  • lalu hapus semua baris yang mengandung a 3

Perintah UNIX adalah

ls -1 a* | grep -v 3

ls -1 memperlihatkan satu file per baris.

grepbiasanya menemukan garis yang cocok dengan suatu pola tetapi dengan -vperilaku ini terbalik, yaitu grep menemukan garis yang tidak cocok dengan pola itu.


2
Hai Peter! Akan lebih baik untuk menjelaskan, sedetail apa pun yang relevan, bagaimana solusi Anda bekerja.
Dhag

2
Parsing lsbukan ide goob
chaos

3

Dengan zsh, menggunakan ~ operator glob :

setopt extendedglob
print -rl -- a*~*3*

Dengan gnu lsAnda dapat menggunakan dua --ignoreopsi:

ls -I '[^a]*' -I '*3*'

yang pertama mengabaikan semua nama file yang tidak dimulai dengan adan yang kedua mengabaikan nama file yang berisi3

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.