Cara menemukan semua file kecuali file yang ditentukan


13

The lsdapat memberikan hasil seperti

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

Tetapi sebenarnya saya berharap untuk mencari tahu CentOS-Base.repo, CentOS-Debuginfo.repodan CentOS-Vault.repotetapi tidak CentOS-Media.repo. Jadi saya menjalankan perintah ini

ls [^\(Media\)]

Tetapi saya mendapatkan informasi kesalahan. Bagaimana saya harus melakukannya?



@steeldriver Terima kasih atas tautan Anda, itu sangat berguna bagi saya ..
yode

Anda mungkin mempertimbangkan untuk mengganti shell Anda ke zsh , yang memiliki fasilitas penghapusan pola
Basile Starynkevitch

Jawaban:


10

Dalam kebanyakan kasus sederhana, Anda dapat menggunakan yang berikut (dalam kasus jika kata pertama 1 statis CentOS):

ls CentOS-[BDV]*

  • [BDV] - kelas karakter untuk memastikan subword kedua dimulai dengan salah satu karakter yang ditentukan

atau sama dengan negasi :

ls CentOS-[^M]*

Jika Anda ingin mengabaikan semua nama file yang mengandung Mkarakter, dengan implementasi GNU dari ls(seperti yang biasanya ditemukan pada CentOS), gunakan opsi -I( --ignore):

ls -I '*M*'

-I, --ignore = POLA
tidak mendaftar entri tersirat POLA shell yang cocok

Untuk mengabaikan entri dengan Mediakata:

ls -I '*Media*'

Pola-pola itu perlu diteruskan secara verbal ls, jadi harus dikutip (jika tidak, shell akan memperlakukan mereka sebagai gumpalan untuk meluas).


Mengapa kami tidak dapat menggunakan ls *[^M]*
yode

The ls CentOS-[^M]*pekerjaan, tetapi ls *[^M]*tidak ..
yode

@yode, tergantung pada apa yang ingin Anda abaikan: Mkemunculan karakter ATAU Mediakata?
RomanPerekhrest

Tetapi dalam kasus saya, hanya file itu yang memiliki karakter M.
Yode

3
Polanya serakah: * pertama cocok dengan semua kecuali huruf terakhir, [^ M] cocok dengan huruf terakhir karena tidak ada yang berakhir dengan M dan trailing * cocok dengan string kosong. Jadi semuanya cocok. Dan bahkan jika sesuatu berakhir dengan M, itu masih akan cocok, dengan asumsi ada sesuatu yang berbeda dari M di suatu tempat: misalnya jika Anda memiliki file bernama OOM, bintang pertama akan cocok dengan O pertama, [^ M] akan cocok dengan O kedua dan start awal akan cocok dengan M.
NickD

12

Beberapa shell memiliki operator globbing negasi:

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

    ls -d -- !(*Media*)
    
  • bash:

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh:

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

6

Salah satu pilihan adalah untuk digunakan finddengan -not -name bendera. Yaitu find . -not -name CentOS-Media.repo. Jika Anda tidak ingin mengulang struktur direktori, tambahkan -maxdepth 1flag.

Atau, seseorang dapat menulis yang berikut ini (yang jauh lebih kompleks, tetapi saya lupa tentang -notflag dan memposting jawaban ini pada awalnya, jadi saya tidak akan menghapus bagian ini):

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

Anda perlu memaksa finduntuk memisahkan nama file dengan byte nol, sehingga baris baru dalam nama file tidak akan memecah apa pun. Semoga grepmendukung pemisah semacam ini dengan bendera -z. Anda mungkin ingin kembali ke pemisahan khas (yaitu byte nol -> baris baru) dengantr '\0' '\n'


1
Anda juga bisa mendapatkan nama file yang dipisahkan nol dengan printf '%s\0' *yang tidak berulang dan tidak menyertakan dotfile secara default (tetapi beberapa shell memiliki opsi untuk itu). Anda juga tidak perlu -Euntuk itu regexp, tapi untuk pilih-pilih anda harus backslash yang .atau memasukkannya ke dalam [], dan Anda lakukan tergantung pada GNU menemukan dan grep.
dave_thompson_085

4

Cara termudah adalah menggunakan find. Melakukan:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

Di sini "f" berarti hanya mencari file biasa (tidak termasuk symlink ke file biasa; dengan GNU find, gunakan -xtype fsebaliknya untuk memasukkannya). Jika Anda ingin mencari direktori, berikan "d".

( -maxdepthsementara awalnya ekstensi GNU sekarang cukup umum. Jika Anda findtidak mendukungnya, Anda dapat menggantinya -maxdepth 1dengan standar ! -name . -prune).

lihat halaman manual find untuk fitur-fitur hebat lainnya.

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.