Dosya adında verilen dizeyle eşleşmeyen dosyaları listele


16

Ben adı temp_log.$$ile birçok dosya (yaklaşık 200) kontrol etmek gereken diğer bazı önemli dosyaları ile oluşturulan bir dizin var .

Tüm dosyaları kolayca listeleyebilir ve temp_log.$$dosyaların görüntülenmesini nasıl engelleyebilirim?

Beklenen çıktı

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

lsMan sayfasını inceledim ancak bu referansta hiçbir şey bulamadım. Burada herhangi bir önemli bilgiyi kaçırırsam lütfen bize bildirin.

Teşekkürler


BASH'de ls --hide='temp_log.$$'çalışmalı. Bunu, tüm terimin hangi kısmına bağlı olarak joker karakterlerle genişletebilir / genişletmelisiniz temp_log.$$.
erch

Yanıtlar:


25

GNU ls(gömülü olmayan Linux ve Cygwin'deki sürüm, bazen başka yerlerde de bulunur), bir dizini listelerken bazı dosyaları hariç tutabilirsiniz.

ls -I 'temp_log.*' -lrt

(uzun formu not -IIS --ignore='temp_log.*')

Zsh ile kabuğun filtrelemeyi yapmasına izin verebilirsiniz. Eşleşen dizinlerin içeriğini listelemekten kaçınmak -diçin lsbu adrese geçin .

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

Ksh, bash veya zsh ile ksh filtreleme sözdizimini kullanabilirsiniz. Zsh'de setopt ksh_globönce çalıştırın . Bash'da shopt -s extglobönce koş .

ls -dltr !(temp_log.*)

Lütfen, GNU ls için örnekte tek tırnak kullanmayın: ls -I 'temp_log. *' -Lrt Komuta desen aktarmak ve kabuğun onu genişletmesine izin vermemek gerekir.
shargors

Ubuntu bash v4.3.48'de, ondan -Itemp_log.*sonra herhangi bir boşluk olmamalıdır-I
Yan King Yin

1
@YanKingYin Hayır -I. Ancak, *ihtiyaçlar şu ya da bu şekilde belirtilmelidir. -I temp_log.*işe vermez -I 'temp_log.*', -I "temp_log.*", -I temp_log.\*vb iyidir.
Gilles 'SO- kötü olmayı kes'

10

grepSeçenek ile birlikte kullanabilirsiniz -v.

ls -lrt | grep -v <exclude-filename-part>

1
bunun neden reddedildiğinden emin değilim, doğru cevap bu.
Tim Kennedy

5
Ls çıkışında grep yapmak her zaman doğru değildir ve önerilmez. Yan etkileri vardır. Kesin sorunları hatırlayamıyorum. Yan not - aşağı oy benden değildi;)
mtk


3

Bunun için kullanabilirsiniz find:

find . \! -name 'temp_log*'

Bu sadece adları yazdıracak, zaman damgası ve izinlerle -lsbir ls -lstil çıkışı yapmak için ekleyebilir veya -exec ls {} +sütunlar, sıralama vb. İçin istediğiniz seçeneklerle gerçekten ls'ye geçmek için kullanabilirsiniz .

Bunun sadece bir dizindeki dosyalar olduğunu varsayarak yazdım. Dizin başka dizinler içeriyorsa, bunları tekrar tekrar listelemekten kaçınmak isteyebilirsiniz

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

Eğer ls kullanmak Ve eğer durdurmak için -d seçeneği geçmek isteyeceksiniz o dizinlere içinde girişinizdeki:-exec ls -d {} +


Muhtemelen -maxdepth 1özyinelemesiz taklit etmek de istiyorum ls.
jw013

Güzel. Daha az POSIX'e sahip findolmayan kullanıcılar -maxdepth buraya bakmalıdır .
Joker karakter

2

Sanırım kabuğun bir özelliğini kullanmak istiyorsunuz, değil ls. Ben bash kullanıyorum, bu yüzden ne istediğini kontrol ettim man bash. "^ GENLEŞME" araması yapın (önce '/' tuşuna basarak). Alıntı:

GENİŞLEME

    Genişletme, komut satırında sözcüklere ayrıldıktan sonra gerçekleştirilir. Gerçekleştirilen yedi tür genişletme vardır: küme ayracı genişletme , tilde genişletme , parametre ve değişken genişletme , komut ikamesi , aritmetik genişletme , sözcük bölme ve yol adı genişletme .

   ︙
... <
   ekran alıntısı > ... ︙

Yol Adı Genişletme

    Sürece kelimesi yarma sonra, -f seçeneği ayarlandığında, bash karakterleri için her kelimeyi tarar *, ?ve [. Bu karakterlerden biri belirirse, kelime bir desen olarak kabul edilir ve onun yerine desenle eşleşen alfabetik olarak sıralanmış dosya adlarının bir listesi gelir. ...

Geçenlerde ilk harfine göre dosyaları hariç tutmaya başladım, şöyle bir komutla:

$ ls ./[^t]*

Bu, harfle başlamayan herhangi bir şeyle eşleşir t. Köşeli ayraçlar arasına daha fazla karakter eklerseniz, bu harflerle başlayan dosyaları da hariç tutarsınız.

Bir bağlantı mı arıyorsunuz? Bkz. Örüntü Eşleme . Oradan, bu sizin durumunuz için işe yarar:

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

Bunun için, extglobkabuk seçeneğinin Gilles tarafından belirtildiği gibi shoptbuiltin ( shopt -s extglob) kullanılarak etkinleştirilmesi gerekir .


-1

Sadece yap

ls -ltr `grep -il patterntosearch  *`

grepdosya adından ziyade dosya içindeki bir deseni arar.
evilsoup

-2

DONT yazdırılmasını istediğiniz dosyalar "temp_log" olduğundan. ve ardından grep ile filtreleyin:

ls -lrt | grep -v "temp_log."

NOT: Benzer cevabı olan diğer gönderi muhtemelen kullanıcı tarafından grep'in araması gereken dizenin etrafında "" tırnak işareti içermediğinden aşağıya indirilmiştir. Tırnak işaretleri olmadan, reklamı yapılan gibi çalışmaz.


'NOT'unuz kesinlikle doğru değil. Alıntılanması gerekebilir bazı karakterler vardır, ama bu belirli dize herhangi olduğunu sanmıyorum.
sigara içiyor2345

"temp_log" adlı bir kullanıcı veya grup olana kadar (normal ifadedeki nokta bir boşlukla veya aşağıdaki herhangi bir şeyle eşleşir temp_log. Bu, lssonuçları hariç tutmak için iyi (genel) bir yol değildir .
Jeff Schaller

sadece -F, @ smokes2345; nokta, normal normal ifadedeki herhangi bir karakterle eşleşir. Bakınız: unix.stackexchange.com/q/119905/117549
Jeff Schaller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.