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

mtk
sumber
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.*)
Gilles 'SO- berhenti menjadi jahat'
sumber
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'
10

Anda dapat menggunakan grepopsi ini -v.

ls -lrt | grep -v <exclude-filename-part>
andrade
sumber
1
tidak yakin mengapa ini diturunkan, itu jawaban yang benar.
Tim Kennedy
5
Melakukan grep pada ls output tidak selalu benar dan tidak disarankan. Ini memiliki efek samping. Tidak dapat mengingat masalah yang pasti.
Suara
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 {} +

Random832
sumber
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 .

Alex Leach
sumber
-1

Lakukan saja

ls -ltr `grep -il patterntosearch  *`
pengguna43658
sumber
grepmencari pola di dalam file, bukan di nama file.
evilsoup
-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.

pengguna185160
sumber
'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