Yanıtlar:
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 tree
belirli 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, tree
kendisi joker karakterleri destekler.
ls
bir dizini listelemek istediğinizde , onu açar, aynı şekildedir ls -l BirthdayPhotos
. Bu davranışı ile bastırabilirsiniz ls -d B*
.
B*
bir dizin belirtimi olarak kabul ediyor?
B*
, tüm dizinlerle eşleşecek şekilde genişler, B
böylece gerçekten ls
bir dizin listesini geçirirsiniz , bu yüzden hepsini sizin için açar.
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 .
find
Desenli 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
find
Bir desen kullanarak dosya ismi aramak için komutlu seçenek
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 ABC
metninizle değiştirerek .
Komutu anlamak için, hadi biraz parçalayalım:
find
Geçerli dizindeki ve alt dizinlerindeki tüm dosyaları listeler; yalnız kullanmak sadece orada her şeyi listeleyecek. Not find
her dosya veya dizin başlangıç verir ./
kendi yolunu geçerli dizinine göre olduğunu belirtir. Bunun bilincinde olmak önemlidir, çünkü bu ./ABC
sadece 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ı find
yönlendirilir grep
. Buna boru denir.
grep
çıktıyı alır ve verilen deseni kullanarak filtreler ^\./ABC
.
' '
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 grep
bunun 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.)
find | grep
find
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
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.
Ardından, sadece normal ifadeyi yazın ABC*
ve onaylayın.
Adı şablonunuzla eşleşen her dosya otomatik olarak seçilecektir.
Ubuntu 12.10 (Quantal) 'da GNOME3 PPA'dan Nautilus 3.6. * Kullanıyorum.
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"
ABC*
Dosyaların bulunduğu dizini bilmiyorsanız ve milyonlarca dosyanız varsa, locate
komut 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:
find
başlayan komut çok uzun bir zaman/
alacaktır ve birçok izin hatası verecektir .sudo updatedb
.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.
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 },".")'
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.
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 tr
iyi 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
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:
Gördüğün gibi
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ı.
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
ls -l B*
gösteriyor ?B