Daftar file yang tidak cocok dengan string yang diberikan dalam nama file


16

Saya memiliki direktori di mana banyak file (sekitar 200) dengan nama temp_log.$$dibuat dengan beberapa file penting lainnya yang perlu saya periksa.

Bagaimana saya bisa dengan mudah mendaftar semua file dan mengecualikan temp_log.$$file agar tidak ditampilkan?

Output yang diharapkan

$ ls -lrt <exclude-filename-part>
-- Lists files not matching the above given string

Saya telah membaca lshalaman manual tetapi tidak dapat menemukan apapun dalam referensi ini. Tolong beri tahu saya jika saya melewatkan informasi penting di sini.

Terima kasih


di BASH, ls --hide='temp_log.$$'seharusnya bekerja. Anda juga bisa / harus memperpanjang ini dengan wildcard, tergantung bagian mana dari keseluruhan istilah temp_log.$$ini.
erch

Jawaban:


25

Dengan GNU ls(versi tentang Linux dan Cygwin yang tidak tertanam, terkadang juga ditemukan di tempat lain), Anda dapat mengecualikan beberapa file saat mendaftar direktori.

ls -I 'temp_log.*' -lrt

(perhatikan bentuk panjang -Iis --ignore='temp_log.*')

Dengan zsh, Anda dapat membiarkan shell melakukan penyaringan. Lewati -duntuk lsmenghindari daftar isi direktori yang cocok.

setopt extended_glob          # put this in your .zshrc
ls -dltr ^temp_log.*

Dengan ksh, bash atau zsh, Anda dapat menggunakan sintaks filter ksh. Di zsh, jalankan setopt ksh_globdulu. Di bash, jalankan shopt -s extglobdulu.

ls -dltr !(temp_log.*)

Tolong, jangan kutip tunggal dalam contoh untuk GNU ls: ls -I 'temp_log. *' -Lrt Mereka perlu meneruskan pola ke perintah dan tidak membiarkan shell memperluasnya.
shargors

Di Ubuntu bash v4.3.48, seharusnya -Itemp_log.*tanpa ruang setelah-I
Yan King Yin

1
@YanKingYin Tidak, tidak masalah memiliki ruang setelah -I. Namun, *perlu dikutip satu atau lain cara. -I temp_log.*tidak bekerja tetapi -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*, dll baik-baik saja.
Gilles 'SANGAT berhenti menjadi jahat'


3

Anda dapat menggunakan findini:

find . \! -name 'temp_log*'

Ini hanya akan mencetak nama, Anda dapat menambahkan -lsuntuk membuat ls -lkeluaran gaya dengan stempel waktu dan izin, atau gunakan -exec ls {} +untuk benar-benar beralih ke ls dengan opsi apa pun yang Anda inginkan untuk kolom, pengurutan, dll.

Saya menulis ini dengan asumsi ini hanya file dalam direktori. Jika direktori tersebut berisi direktori lain, Anda mungkin ingin menghindari mendaftarkannya secara rekursif

find . \! -name 'temp_log*' -maxdepth 1

Dan jika Anda menggunakan ls Anda akan ingin memberikan opsi -d untuk menghentikan itu dari daftar dalam direktori:-exec ls -d {} +


Mungkin juga ingin -maxdepth 1meniru non-rekursif ls.
jw013

Bagus. Pengguna yang memiliki POSIX lebih minimal findtanpa -maxdepth harus melihat di sini .
Wildcard

2

Saya pikir Anda ingin menggunakan fitur shell, bukan ls. Saya menggunakan bash, jadi saya memeriksa apa yang Anda inginkan man bash. Cari "^ EXPANSION", (dengan terlebih dahulu menekan '/'). Kutipan:

EKSPANSI

    Ekspansi dilakukan pada baris perintah setelah dipecah menjadi kata-kata. Ada jenis tujuh ekspansi yang dilakukan: ekspansi brace , tilde ekspansi , parameter dan ekspansi variabel , substitusi perintah , ekspansi aritmatika , kata membelah , dan ekspansi pathname .

   ︙
... <snip> ...
   ︙

Perluasan Pathname

    Setelah kata membelah, kecuali -f pilihan telah ditetapkan, pesta memindai setiap kata untuk karakter *, ?dan [. Jika salah satu karakter ini muncul, maka kata tersebut dianggap sebagai pola , dan diganti dengan daftar nama file yang diurutkan berdasarkan abjad yang cocok dengan pola tersebut. ...

Saya baru-baru ini mulai mengecualikan file berdasarkan huruf pertama mereka, dengan perintah seperti:

$ ls ./[^t]*

Ini akan cocok dengan apa pun yang tidak dimulai dengan surat itu t. Jika Anda menambahkan lebih banyak karakter di antara tanda kurung, maka Anda mengecualikan file yang dimulai dengan huruf-huruf itu juga.

Mencari tautan, dan saya punya yang bagus! Lihat Pencocokan Pola . Dari sana, ini akan berfungsi untuk kasus Anda:

$ ls -lrt ./!(temp_log.*)

Ini mengharuskan extglobopsi shell diaktifkan menggunakan shoptbuiltin ( shopt -s extglob), seperti yang dinyatakan oleh Gilles .



-2

Karena file yang Anda TIDAK ingin cetak memiliki "temp_log." di nama file, lalu saring dengan grep:

ls -lrt | grep -v "temp_log."

CATATAN: Posting lain dengan jawaban yang mirip mungkin diturunkan karena pengguna tidak menyertakan tanda kutip "" di sekitar string yang harus dicari grep. Tanpa tanda kutip, itu tidak berfungsi seperti yang diiklankan.


'CATATAN' Anda tidak sepenuhnya benar. Ada karakter tertentu yang mungkin perlu dikutip, tapi saya rasa tidak ada dalam string tertentu.
merokok 2345

sampai ada pengguna atau grup bernama "temp_log" (titik di regex akan cocok dengan spasi atau apa pun yang mengikuti temp_log. Ini bukan cara (umum) yang bagus untuk mengecualikan lshasil.
Jeff Schaller

hanya dengan -F, @ smokes2345; suatu periode akan cocok dengan karakter apa pun dalam ekspresi reguler dasar. Lihat: unix.stackexchange.com/q/119905/117549
Jeff Schaller
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.