Komut satırından dosya sisteminde bir dosya nasıl bulunur?


10

Bir dosyanın (kısmen bilinen bir dosya adına sahip) dosya sisteminde nerede olduğunu bulmak istiyorum. Bunu bir GUI yardımcı programı kullanmak yerine, komut satırından nasıl yapacağımı bilmek istiyorum.

Windows'da aşağıdakileri çalıştırırım:

cd /d C:\
dir *filename* /s

Linux eşdeğeri nedir?


Açıkçası, bu kedinin derisini almanın birden fazla yolu var . Hala bunu yapmanın bir yolu olup olmadığını bilmek biraz merak ediyorum ls?
Iszi

Yanıtlar:


13
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

(Ana şartlar ve koşullar için okumaya devam edin. İnce baskı için kılavuzu okuyun.)

Bir dizinin içeriğini listelemek, türünün ikincil bir özelliğidir ls. Ana işi ls, karmaşıklığının çoğunu üstlenen iş, ekranını ince ayar yapmaktır. (El kitabına bakın ve hangi dosyaların görüntüleneceğini seçmeyle ilgili seçeneklerin sayısını ve her dosya hakkında hangi bilgilerin görüntüleneceğini ve ekranın nasıl biçimlendirildiğini kontrol eden seçeneklerin sayısını karşılaştırın. Bu, hem GNU ls ' Linux'ta ve ilk günlerden beri daha az seçeneğe sahip diğer sistemlerde bulabilirsiniz .)

Varsayılan modu, lsbir dizini ilettiğinizde o dizindeki dosyaları listelemesidir. Başka bir dosya türünü iletirseniz (normal dosya, sembolik bağlantı vb.), Yalnızca o dosyayı listeler. (Bu, her bağımsız değişken için ayrı ayrı geçerlidir.) Seçenek hiçbir zaman bir dizine inmemesini -dsöyler ls.

ls-Rdizinleri özyinelemeli olarak listelemesini söyleyen bir seçeneğe sahiptir. Ancak, uygulanabilirliği sınırlıdır ve çıktıda fazla filtrelemeye izin vermez.

Desen eşleştirmesini gerçekleştiren ilk araç kabuğun kendisidir. Başka bir komuta ihtiyacınız yoktur: joker karakterlerinizi yazmanız yeterlidir. Buna globbing denir .

echo *filename*

Geleneksel olarak, joker karakterler geçerli dizin (veya belirtilen dizin:) ile sınırlıydı echo /some/where/*filename*. A *, herhangi bir dosya adıyla veya dosya adının herhangi bir bölümüyle *.txteşleşir , ancak eşleşmez foo/bar.txt. Modern mermiler, **/“bu dizinde veya altındaki herhangi bir dizinde (özyineli olarak)” anlamına gelen deseni ekledi . Bash ile, tarihsel uyumluluk nedenleriyle, bu özelliğin açıkça etkinleştirilmesi gerekir shopt -s globstar(bu satırı içine koyabilirsiniz ~/.bashrc).

echo **/*filename*

echoKomut sadece size kabuk arka tarafından oluşturulan dosya adları listesini yankılanır. İstisna olarak, eşleşen dosya adı yoksa, joker karakter deseni bash'da değişmeden kalır (siz ayarlamadıysanız shopt -s nullglob, bu durumda desen boş bir listeye genişler) ve zsh bir hata sinyali (siz ayarlamadığınız sürece setopt nullglobveya setopt no_no_matchbu da desenin değişmeden kalmasına neden olur).

Yine lsde seçenekleri için kullanmak isteyebilirsiniz . Örneğin ls, dosyanın yapısı veya izinleri (dizin, yürütülebilir vb.) Hakkında renklerle göstergeler verebilir. Dosyanın tarihini, boyutunu ve sahipliğini ile görüntülemek isteyebilirsiniz ls -l. Daha fazla seçenek için kılavuza bakın.

Bir dizin ağacında dosya aramak için kullanılan geleneksel komuttur find. Hangi dosyaların görüntüleneceğini ve bunlarla ne yapılacağını kontrol etmek için birçok seçenekle birlikte gelir. Örneğin, adı *filename*geçerli dizindeki ve alt dizinlerindeki desenle eşleşen dosyaları aramak ve adlarını yazdırmak için:

find /some/dir -name '*filename*' -print

-printbir eylemdir (diğer eylemlerin çoğu dosyada bir komut yürütmekten oluşur); bir eylemde bulunmazsanız -print, ima edilir. Ayrıca, geçilecek herhangi bir dizin belirtmezseniz ( /some/diryukarıda), geçerli dizin ima edilir. Koşul -name '*filename', yalnızca adı bu kalıpla eşleşen dosyaları listelediğini (veya üzerinde işlem yaptığını) söylüyor; -mtime -1son 24 saat içinde değiştirilen dosyaları eşleştirmek gibi birçok filtre daha vardır . Bazen -name '*filename*'yalnızca joker karakter geçerli dizindeki herhangi bir dosyayla eşleşmezse tırnak işaretlerini atlayabilirsiniz (yukarıya bakın). Sonuçta, kısa form

find -name '*filename*'

Bir dosyanın adını (bir kısmını) bildiğinizde başka bir yararlı araçtır locate. Bu araç, dosya adları veritabanını sorgular. Tipik sistemlerde, her gece yenilenir. Avantajı locateover find /o çok daha hızlı olmasıdır. Bir dezavantajı, bilgisinin eski olabileceğidir. locateÇok kullanıcılı sistemlerde davranışlarında farklılık gösteren birkaç uygulama vardır : temel locateprogram yalnızca herkese açık olarak okunabilir dosyaları endeksler ( updatedbhesabınızdaki tüm dosyaları endeksleyen ikinci bir veritabanı oluşturmak için tamamlayıcıyı çalıştırmak isteyebilirsiniz ); tüm dosyaları dizine ekleyen ve locateprogramın yalnızca görebileceğiniz dosyaları döndürmek için veritabanını filtrelemesini sağlayan başka sürümler (mlocate, slocate) vardır .

locate filename

Bazen bir dosyanın dağıtımınızdaki bir paket tarafından sağlandığını düşünürsünüz, dosyanın adını (bir kısmını) bilirsiniz, ancak paketinizin adını bilmezsiniz ve paketi yüklemek istersiniz. Birçok dağıtım bunun için bir araç sağlar. Ubuntu'da öyle apt-file search filename. Diğer sistemlerde eşdeğer komutlar için Pacman Rosetta'yı kontrol edin .


Bunu tekrar oylayabilseydim. Sadece bu gece başka bir proje aramak zorunda kaldım. Tekrar teşekkürler, @Gilles!
Iszi

6

DOS örneğinize eşdeğerdir:

cd /
find . -name \*filename\* -print

Linux'ta -printartık tartışmaya genellikle ihtiyacınız yok. Kendinizi diğer işletim sistemlerinde çalışırken bulursanız, bunu bilmek faydalı olabilir.


5

Kritik bir durumda değil, "hızlı" bir şey istiyorsanız ve sadece var olup olmadığını ve nerede olduğunu bilmek istiyorsanız kullanabilirsiniz locate. Bilgi toplamak için söylediğiniz dizinlerdeki tüm dosyaların veritabanını tutar.

Varsayılan kurulumda (Ubuntu'da), dosya sistemini tarayan ve veritabanını güncelleyen locategünlük bir croniş ayarlar ...

Eğer bir sonraki cron güncellemeden önce güncel veritabanı getirmek gerekir düşünüyorsanız, bu genellikle daha hızlıdır findveya lssadece çalıştırmak için sudo updatedbdaha sonra ve locate. Daha fazla arama yapmanız gerekiyorsa kesinlikle daha hızlı ... adından da anlaşılacağı gibi, updatedbkullanılan veritabanını günceller locate...

locateyerleşik regex vardır, bu da çok kullanışlı hale getirir ... findBir komut dosyasında kullanacağım , ancak findkomut satırında nadiren kullanıyorum . Hatta locate(kişisel) senaryolarda bile kullanıyorum .locate -bir "oo.*datt.*mp4$"

locate eşleşen dosyaların tam yollarını döndürür.


2
find [path] -name [filename]

Örneğin, / home dizininde foo içeren bir dosya adı aramak istersem şu komutu kullanırdım:

find /home -name *foo*

man findfind komutu ve bağımsız değişkenler hakkında daha fazla bilgi için komutu kullanın ,


3
*Kabuğun bunları yorumlamasını önlemek için teklif vermeniz veya kaçmanız gerekir.
Shawn J. Goff

Bu dağıtım / kabuk spesifik mi? Ben kaçmadan Fedora 16 koştu ve iyi çalıştı.
josh-cain

1
Bazı kabuklarda, hiçbir şeyle eşleşmezlerse yıldızları programa ileten seçenekler vardır. Geçerli dizinde bu kalıpla eşleşen bir dosya oluşturmayı deneyin ve komutu tekrar deneyin.
Shawn J. Goff
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.