~ (Yedek dosyalar) ile biten dosyaların listelenmesinden kaçının


20

Benim gereksinimim, ~(yedekleme dosyaları) ile biten dosyalar hariç, bir dizindeki tüm dosyaları listelemektir .

Komutu kullanmaya çalıştım:

ls -l | grep -v ~    

Bu çıktıyı alıyorum:

asdasad
asdasad~
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell1.sh~
testshell2.sh
testshell2.sh~
testtwo.txt
testtwo.txt~
test.txt
test.txt~

Sadece şu dosyaları almak istiyorum:

asdasad
file_names.txt
normaltest.txt
target_filename
testshell1.sh
testshell2.sh
testtwo.txt
test.txt

İle biten dosyaları listelemekten kaçınmaya çalıştığınız anlaşılıyor ~. Bu dosya benim bazı metin editörleri oluşturulan yedek dosyalarıdır.
ctrl-alt-delor

Hangi işletim sistemini kullanıyorsunuz: bu bir Gnu / Linux (Debian, Ubuntu, Redhat, Centos, Fedora, Suse, Mint, Arch,… gibi) mı?
ctrl-alt-delor

2
Yoksaymak istediğiniz dosyanın Emacs yedek dosyaları olduğunu unutmayın. Emacs davranışını değiştirmek kolaydır, böylece yedekleri merkezi bir dizine kaydeder, her yerde değil; bkz. emacs.stackexchange.com/questions/33/…
Kilian

Kötü olduğum için üzgünüm ama sana inanmıyorum; ls -l(ell harfi) listelenen her dosya için izinleri, bağlantıları, sahibi, boyutu ve mod zamanı içerir. Gösterdiğiniz çıktıyı üretecek olan ls -1(bir basamak) ve terminalde-1 tek sütunlu çıktı üretmek için birçok sistemde gereklidir , ancak boru (burada olduğu gibi ) veya yeniden yönlendirildiğinde, gerekli değildir, zaten tek sütundur . lsgrep-1
dave_thompson_085

@ dave_thompson_085 Tüm metni ve sadece dosya adlarını burada kısalttım .. Çünkü bunun alakasız olduğunu hissettim. Ayrıca bu bir üretim sistemidir (kendi sistemim değil). Bu yüzden kullanıcı adlarını, detayları listelemek ve sızdırmak istemiyorum.
curious_one

Yanıtlar:


49
ls -l | grep -v ~

Bunun işe yaramamasının nedeni, tilde'nin ana dizininize genişletilmesidir, bu nedenle grephiçbir zaman gerçek bir tilde görmez. (Bkz. Örn . , Tilde Genişletme ile ilgili Bash el kitabı .) Genişlemeyi önlemek için alıntı yapmanız gerekir;

ls -l | grep -v "~"

Tabii ki, bu, bir dosya adının ortasında veya lsçıktının başka bir yerinde bile tilde bulunan herhangi bir çıktı satırını kaldıracaktır (ancak muhtemelen kullanıcı adlarında , tarihlerde veya benzeri yerlerde görünme olasılığı yoktur). Yalnızca yalnızca bir tilde biten dosyaları yoksaymak istiyorsanız,

ls -l | grep -v "~$"

48

GNU uygulamasının ls(çoğu Linux sisteminde bulunur) bunun için bir seçeneği vardır: -BYedekleri yoksay:

ls --ignore-backups

24

Bash kullanıyorsanız extglob, etkinleştirildiğinden emin olun :

shopt -s extglob

Sonra şunları kullanabilirsiniz:

ls -d -- !(*~)
  • -d dizinlerin içeriğini göstermemek
  • !(*~) ile bitenler hariç tüm dosyalar ~

Zsh'de, aynı kshglobseçeneği veya kendi genişletilmiş glob'larını kullanarak yapabilirsiniz:

setopt extended_glob
ls -d -- ^*~

Hariç tutulacak sonek yalnızca bir karakter uzunluğunda olduğundan, son karakterin tilde olmadığı dosya adlarını da eşleştirebilirsiniz (bu da olmadan çalışmalıdır extglob):

ls -d -- *[^~]

Ancak genel fikir kullanmaktır ls --ignore-backups.


12

Bu yardımcı olacaktır:

ls -l | grep -v '~'  

Neden: ~ char komut yürütülmeden önce ana dizininiz ile değiştirilir. Deneyin

echo ~

ve

echo '~'

6

Diğer yanıtlarda belirtildiği gibi, muhtemelen sorun yaşamanızın nedeni tilde teklif vermemeniz veya kaçmamanızdır.

Belirli bir kullanım durumunda, benzer bir şey yapmak için kabuk dosya adı genişletmesini kullandım. 2003 yılından beri kullanıyorum, bu da farklı sistemlerde çok çeşitli kabuk uygulamaları üzerinde çalıştığı anlamına geliyor. (burada da -Csıralı sütunlarda hoş bir görüntü istediğim için kullanıyorum )

ls -C *[!~]

(kabuk dosya adı genişletmesinin kullanılmasının bir kısıtlaması elbette çok sayıda (yedek olmayan) dosyaya sahip bir dizinin, genişlemenin kullanılabilir bağımsız değişken listesi boyutunu aşmasına neden olacağıdır, ancak çoğu modern sistemde bu sınır oldukça yüksektir 250 KB veya daha fazla, bazen çok daha fazla)


1

ls | grep -v '~$'hızlı bir çözümdür. Tüm (gizli olmayan) dosyaları listelemek için ls kullanır, ardından sonunda -vtilde ( ~) bulunan tüm satırları ($ ) .

ANCAK, bir şey1, bir şey2 adında HERHANGİ bir dosyanız varsa, ls çalışma biçimini değiştirmek gibi hantal hack'lerle değil, kaynakta düzeltmeniz gereken kötü bir iş akışına sahip olduğunuz BÜYÜK kokulu bir göstergedir.

Kendinizi test1 ve test2 veya testone ve testtwo gibi sürüm numaralarına sahip adlarla bulursanız, gerçekten istediğiniz şey bir sürüm kontrol sistemidir. git .

Bu, özellikle birden çok dosyanın birden çok sürümüne sahip olduğunuz durumda geçerlidir ve sürümün tüm dosyalar arasında koordine edilmesi gerekir.

Sürüm kontrol sistemleri, bir zaman penceresini dosya sistemine yerleştirmenize izin verir, böylece yalnızca test dosyayı , ancak başlık altında (sürüm kontrol programı aracılığıyla) tüm sürümleri aramak, almak, geri almak, karşılaştırmak vb. .

Bu kurulumu yaptıktan sonra, artık düzenleyicinizden yedek dosyalara ihtiyacınız yoktur, çünkü sürüm kontrolü, kullanmaya başladığınızdan beri dosya geçmişine sahiptir, o zamandan beri bin değişiklik yapmış olsanız bile. Gerekirse, yeni bir fikir deneyerek ve zamanda geriye gidip sonra farklı bir fikir denemek için geçmiş zaman çizelgesini "dallayabilirsiniz".


1

Birçok cevap doğru olsa da ( @Foonözellikle 'bir tanesini seviyorum '), adların listesini almanın ls -lçeşitli nedenlerle biraz topal olduğunu unutmayın .

Dosyaları bulmak için uygun araç, şaşırtıcı bir şekilde find.

Vuruşlarından biri, "seçim mantığını" tek başına işleyebilmesidir, örneğin:

$ find . -maxdepth 1 \( -type f -a \! -name '*~' \) -print

tam anlamıyla şunu söyler find:

  1. Geçerli dizindeki dosyaları arayın: .
  2. Onları yalnızca bu dizinin düzeyinde arayın; yani, tekrar etmeyin: -maxdepth 1
  3. Orada varlıkları arayın,

    • dosya türü: -type f
    • ve: -a
    • adları bitmeyen ~: ! -name *~ (burada !, dosya adlarıyla eşleşen aşağıdaki yönergeyi reddeder -name *~).

    (Tür ve addaki tüm eşleşmenin mantıksal bir birim olarak görünmesini sağlamak için (ve) ).

  4. Bulunan her dosyanın adını yazdır: -print.

Kabuğa özel bazı karakterleri kabuk tarafından yorumlanmaya karşı korumanız gerekir ve bu nedenle parantezler ve patlama, !ters eğik çizgiden kaçar ve ad deseni *~tek tırnaklarla çevrilidir.

findKomut onun seçeneklerin kullanımı yoluyla çok güçlü bir mini dildir. Örneğin, bütün bir dosya sistemi ağacını (veya ağaçları) özyinelemeli olarak işlemesi, ancak tarama sırasında belirli dizinleri atlaması söylenebilir. Dosyaların çeşitli öznitelikleriyle (oluşturma veya değiştirme zamanı veya herhangi bir boyutta) eşleşmek mümkündür.

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.