Bir dizinde “ABC” adıyla başlayan tüm dosyalar nasıl aranır?


58

Belirli bir adla başlayan dosyaları aramam gerekiyor. Belirli bir desenle başlayan birden fazla dosya olabilir ve dizinde bulunan tüm bu dosyaları listelemek istiyorum.

Yanıtlar:


60

Mevcut cevapları tamamlamak için:

ls

Varsayılan dizin listesi yardımcı programı ls, kabuğun joker karakterleriyle birlikte kullanılabilir. Desenli tüm dosyaları aramak için abc:

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

Dosya uzantısının da arama sonuçlarıyla alakalı olduğunu unutmayın.


tree

Dosyaları bir dizin ağacında listelememiz gerekirse, aşağıdaki gibi treebelirli bir deseni aramak için de yayınlayabiliriz :

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

Bu durumda, treekendisi joker karakterleri destekler.


2
Neden yaptığımda , yalnızca eşleşen dizinlerin adları yerine başlayarak tüm dizinlerin içeriğinils -l B* gösteriyor ? B
ErikE

@ErikE Çünkü lsbir dizini listelemek istediğinizde , onu açar, aynı şekildedir ls -l BirthdayPhotos. Bu davranışı ile bastırabilirsiniz ls -d B*.
Azor Ahai

@AzorAhai Peki neden B*bir dizin belirtimi olarak kabul ediyor?
ErikE,

@ErikE Çünkü glob dosyasının kullanımı B*, tüm dizinlerle eşleşecek şekilde genişler, Bböylece gerçekten lsbir dizin listesini geçirirsiniz , bu yüzden hepsini sizin için açar.
Azor Ahai

1
Soruyu cevaplamıyor. ls -d ABC*yazarın sorduğu şeydi. Ayrıca kod pasajındaki yorumlar yanlıştır, abc ile başlayan dizinlerin içeriğinils abc* listeler .
greatvovan

42

findDesenli dosyaları aramak için komutu kullanabilirsiniz

find . -type f -name "abc*" 

Yukarıdaki komut, geçerli çalışma dizini altında abc ile başlayan dosyayı arayacaktır.

-name 'abc'tam eşleşen dosyaları listeler. Örneğin: abc

Ayrıca kullanabilirsin

 -iname
 -regex 

findBir desen kullanarak dosya ismi aramak için komutlu seçenek


7

Onlarla tam olarak ne yapmak istediğinize bağlı olarak, bunu yapmanın birçok yolu vardır. Genel olarak, sadece listelemek istiyorsanız, aşağıdakileri kullanarak bir terminalde yapabilirsiniz:

find | grep '^\./ABC'

... ve ABCmetninizle değiştirerek .

Komutu anlamak için, hadi biraz parçalayalım:

  • findGeçerli dizindeki ve alt dizinlerindeki tüm dosyaları listeler; yalnız kullanmak sadece orada her şeyi listeleyecek. Not findher dosya veya dizin başlangıç verir ./kendi yolunu geçerli dizinine göre olduğunu belirtir. Bunun bilincinde olmak önemlidir, çünkü bu ./ABCsadece ile değil başlayarak sonuçları arayacağımız anlamına gelir ABC.

  • Pipe karakteri |bir komutun çıktısını diğerine yönlendirir, bu durumda çıktısı findyönlendirilir grep. Buna boru denir.

  • grepçıktıyı alır ve verilen deseni kullanarak filtreler ^\./ABC.

    • Desenin ' 'kabuğun içindeki özel karakterleri yorumlamasını önlemek için tek tırnak işaretleri ile alındığına dikkat edin .
  • Şimdi, kalıbın kendisi düzenli ifade ya da kısaca regex adı verilen belirli bir sözdiziminde yazılmıştır . Regex, ustalaşırsanız son derece güçlü bir arama aracıdır ve bu konuda size daha derinlemesine bilgi veren siteler vardır , ancak grepbunun tam teşekküllü bir regex motoru olmadığını ve onunla her şeyi yapamayacağınızı unutmayın.

  • Amacımız:

    • ^regex'te dizgenin başlangıcıyla eşleşir; bu, dosya adının başında gerçekleşmezse, deseni eşleştirmesini önler.

    • .regex'in de özel bir anlamı vardır: "Burada herhangi bir karakterle eşleş" anlamına gelir. Edebi bir nokta olarak kullanmak istemeniz durumunda, ondan \önce bir ters eğik çizgi kullanarak "kaçmanız" gerekir. (Evet, herhangi bir karakterin eşleştirilmesi bizim durumumuzda zararsız olurdu, ama ben bütünlük uğruna yaptım.)


1
Neden olur sen kendi gayet iyi desen eşleştirme yeteneklere sahiptir? find | grepfind
Darael

3

GREP'yi kullanabilirsiniz, bence bu en basit çözüm, muhtemelen eşleşmeyi daha doğru hale getirmek için başka bazı grep parametreleri de ekleyin.

tree | grep ABC

2

Nautilus dosya yöneticisini ve düzenli ifadeleri kullanarak belirli bir deseni arayabilirsiniz.

Bunu yapmak için, Dişli menüsünde aşağıdaki gibi Eşleşen Öğeleri Seçin ( Ctrl+ tuşlarına da basabilirsiniz s) tıklayın.

görüntü tanımını buraya girin

Ardından, sadece normal ifadeyi yazın ABC* ve onaylayın.

görüntü tanımını buraya girin

Adı şablonunuzla eşleşen her dosya otomatik olarak seçilecektir.

görüntü tanımını buraya girin

Ubuntu 12.10 (Quantal) 'da GNOME3 PPA'dan Nautilus 3.6. * Kullanıyorum.


1

Benim için en kolay çözüm

ls | grep PATTERN

Burada, DESEN'de herhangi bir düzenli ifade verebilirsiniz.

Örneğin, adının herhangi bir yerinde "ab" olan dosyaları bulmak için,

ls | grep ".*ab.*"

"Ab" ile başlayan dosyaları bulmak için,

ls | grep "^ab"

1

ABC*Dosyaların bulunduğu dizini bilmiyorsanız ve milyonlarca dosyanız varsa, locatekomut en hızlı yöntemdir.

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

Notlar:

  • Yukarıdaki komutun 1 milyon dosya üzerinde çalışması 1 saniye sürer.
  • Buna karşılık, kök dizinde findbaşlayan komut çok uzun bir zaman/ alacaktır ve birçok izin hatası verecektir .
  • Dosyalar bugün oluşturulduysa, önce çalıştırmalısınız sudo updatedb.

0

kullanırım

ls | grep abc

veya

ls -la | grep abc

Sadece abc ile başlamaz, abc ile tüm dosyaları gösterir. Ancak, bunu yapmam için gerçekten kolay bir yol.


0

Python:

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

Perl:

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 

0
printf "%s" /path/to/files/ABC*

Bu, her iki ucunda da sabitlenmiş glob deseni eşleşmesidir. Bu, "ABC", "ABC.txt", "ABC123" gibi "ABC" ile başlayan, ancak "xABC" değil, tüm dosya oluşumlarıyla eşleşir. Burada 'printf' yerine 'ls' kullanan komut satırından güvenli bir alternatiftir, ancak kime katılacağınıza bağlı olarak, 'ls' bir senaryoda kullanım için güvenli değildir. Bu durumda glob deseni eşleştirme ile 'printf' kullanmak güvenli kabul edilir. Bunu bir komut dosyasında kullanacaksanız, 'printf' çıktısı, çıktı akışının sonuna kadar yeni bir satır karakteri içermez:

printf "%s" /path/to/files/ABC*  

İade:

/path/to/files/ABC /path/to/files/ABC123

Her durumdan sonra satır sonları gerekiyorsa:

printf "%s\n" /path/to/files/ABC*

İade:

/path/to/files/ABC 

/path/to/files/ABC123

'printf' komutunu çalıştırdığınızda bu şekilde girdiyseniz, "/ path / to / files /" çıktıda kalır. Onsuz sadece dosya adı görünür:

printf "%s" ABC* 

İade

ABC ABC123

Komutu, dosyaların bulunduğu dizinde çalıştırdığınızı varsayalım.


Bu echo /path/to/files/ABC* | tr " " "\n"iyi bir fikir değil. Bir dosya olup olmadığını düşünün /path/to/files/ABC EFG, dosya adında bir boşluk var. Sizin triyi değil iki ayrı hatlar, içine dosya adı kıracak. Dosya adında birden fazla boşluk varsa daha da kötüsü. Bunun printf "%s\n" ABC*yerine, dosya isimlerindeki boşluklara yardım etmesi gereken, ancak yine de gibi diğer özel karakterlerle sorunlu olduğunu kullanmanızı öneririm\n
Sergiy Kolodyazhnyy

0

Command-t en sevdiğim vim eklentilerimden birinde, FZF ile entegrasyonun üstündeki yakut tabanlı eklenti .

Comamnd-T ve FZF'yi kullanarak aramayı son derece hızlı "bulanık" bir mekanizma ile yapabilirsiniz:

  • Dosya ve arabellekleri açma
  • Etiketlere ve yardımlara atlama
  • Çalışan komutlar veya önceki aramalar ve komutlar
  • en az sayıda tuş vuruşuyla.

Gördüğün gibi

görüntü tanımını buraya girin

Her zaman yeni bir terminal açarak komut geçmişinde arama yapıyorum:

CTRL+R

Herhangi bir terminal sekmesine yazarak tüm klasörlerde art arda arama yapmaya ek olarak:

fzf

Ardından dosya adınızı başlatın

ABC

Ayrıca, içine yazabilirsiniz vim

:CommandT 

Özellikle büyük klasörler için gerçekten yararlı.


0

Kök dizinde olduğumu ve sadece etc dizininin listesini istediğimi varsayalım:

find -type d -name "etc"

elde ettiğimiz sonuç

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

Başka bir örnek,

Ayrıca yazabiliriz:

ls | grep "etc"

anlıyoruz

etc
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.