The ls
dapat 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.repo
dan CentOS-Vault.repo
tetapi tidak CentOS-Media.repo
. Jadi saya menjalankan perintah ini
ls [^\(Media\)]
Tetapi saya mendapatkan informasi kesalahan. Bagaimana saya harus melakukannya?
Jawaban:
Dalam kebanyakan kasus sederhana, Anda dapat menggunakan yang berikut (dalam kasus jika kata pertama 1 statis
CentOS
):[BDV]
- kelas karakter untuk memastikan subword kedua dimulai dengan salah satu karakter yang ditentukanatau sama dengan negasi :
Jika Anda ingin mengabaikan semua nama file yang mengandung
M
karakter, dengan implementasi GNU darils
(seperti yang biasanya ditemukan pada CentOS), gunakan opsi-I
(--ignore
):Untuk mengabaikan entri dengan
Media
kata:Pola-pola itu perlu diteruskan secara verbal
ls
, jadi harus dikutip (jika tidak, shell akan memperlakukan mereka sebagai gumpalan untuk meluas).sumber
ls *[^M]*
?ls CentOS-[^M]*
pekerjaan, tetapils *[^M]*
tidak ..M
kemunculan karakter ATAUMedia
kata?M
.Beberapa shell memiliki operator globbing negasi:
zsh -o extendedglob
:ksh
,zsh -o kshglob
,bash -O extglob
:bash
:ksh
:sumber
Salah satu pilihan adalah untuk digunakan
find
dengan-not -name
bendera. Yaitufind . -not -name CentOS-Media.repo
. Jika Anda tidak ingin mengulang struktur direktori, tambahkan-maxdepth 1
flag.Atau, seseorang dapat menulis yang berikut ini (yang jauh lebih kompleks, tetapi saya lupa tentang
-not
flag 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
find
untuk memisahkan nama file dengan byte nol, sehingga baris baru dalam nama file tidak akan memecah apa pun. Semogagrep
mendukung pemisah semacam ini dengan bendera-z
. Anda mungkin ingin kembali ke pemisahan khas (yaitu byte nol -> baris baru) dengantr '\0' '\n'
sumber
printf '%s\0' *
yang tidak berulang dan tidak menyertakan dotfile secara default (tetapi beberapa shell memiliki opsi untuk itu). Anda juga tidak perlu-E
untuk itu regexp, tapi untuk pilih-pilih anda harus backslash yang.
atau memasukkannya ke dalam[]
, dan Anda lakukan tergantung pada GNU menemukan dan grep.Cara termudah adalah menggunakan find. Melakukan:
Di sini "f" berarti hanya mencari file biasa (tidak termasuk symlink ke file biasa; dengan GNU
find
, gunakan-xtype f
sebaliknya untuk memasukkannya). Jika Anda ingin mencari direktori, berikan "d".(
-maxdepth
sementara awalnya ekstensi GNU sekarang cukup umum. Jika Andafind
tidak mendukungnya, Anda dapat menggantinya-maxdepth 1
dengan standar! -name . -prune
).lihat halaman manual find untuk fitur-fitur hebat lainnya.
sumber