Komut satırını kullanarak ada göre bir dosya bulun


182

Komut satırı kullanarak bir dosyanın konumunu belirlemek istiyorum. Denedim:

find . -type f -name "postgis-2.0.0"

ve

locate postgis-2.0.0

boşuna. Dosyanın dizinini belirleme adı verilen komut nedir?


2
locateKomut iyidir, sadece komutunu kullanarak, ilk locatedb güncellemeupdatedb
thucnguyen

Daha önceden yüklenmişse, yeni dosya adı postgis-2.0.0artık olmayabilir . Genellikle paket yöneticileri aracılığıyla yapılan kurulumlardan sonra, yürütülebilir dosyalar $PATHklasörlerden birinde olur which postgisve konumu görmeyi deneyin . Hiçbir şey döndürmezse, yalnızca o zaman el ile dosya konumunu aramalısınız.
sdkks

Yanıtlar:


231

find ~/ -type f -name "postgis-2.0.0"Bunun yerine deneyin .

Kullanmak .yalnızca geçerli dizini arayacaktır. ~/ana dizininizin tamamını arayacak (muhtemelen indirdiğiniz yere). Eğer kullanılırsa wgetkök olarak kullanmak böylece, onun olası başka bir yere olabilir /bütün dosya sistemini aramak için.

İyi şanslar


1
oh ya wgetroot olarak kullandım bu yüzden /işe
yaradım

daha fazla bilgi için bu bağlantıyı kontrol edin help.ubuntu.com/community/find
habibun

Buluyorum: / Kullanıcılar / KullanıcıAdı // Kütüphane / Kayıtlı Uygulama Durumu / com.bitrock.appinstaller.savedState: İzin reddedildi hatası. komutun her uygulamasında görünür. Ondan nasıl kurtulurum?
Eduard

29

Denerdim:

sudo find / -type d -name "postgis-2.0.0"

. sadece geçerli dizinde arama yapmak anlamına gelir, gerçekten bilmiyorsanız kökünden her şeyi aramak en iyisidir. Ayrıca, -f yazın, klasörleri değil dosyaları arar. Ekleme sudotüm klasörlerde / alt klasörlerde arama yapmasını sağlar.

İçin sözdiziminiz locatedoğru, ancak çalıştırmanız gerekebilir

sudo updatedb

ilk. Sebep ne olursa olsun, buna locaterağmen asla iyi şansım olmadı .

locatetarafından yapılan dosya ve dizin veritabanını kullanır updatedb. Dolayısıyla, yeni bir dosya indirdiyseniz updatedb, dosya ve dizin veritabanını güncellemediğiniz için daha fazla şans vardır. Yardımcı programı kullanmadan sudo updatedbönce kullanabilirsiniz locate. updatedbgenellikle linux sistemlerde günde bir kez çalışır.


14

bulmak en kullanışlı Linux / Unix araçlarından biridir.

Deneyin find . -type d | grep DIRNAME


Grep over-name kullanmanın herhangi bir avantajı var mı?
TryHarder

@oooooo Aşağıdaki
cevabımda

Bulmak artı grep benim için çalışan tek şeydi
malhal

12

Diğer cevaplar iyidir, ancak Permission deniedaçıklamaların ihmal edilmesinin bana daha net cevaplar verdiğini düşünüyorum ( stderrçalışmamasından kaynaklanmıyor sudo):

find / -type f -iname "*postgis-2.0.0*" 2>/dev/null

nerede:

  • / Aramanıza başlamak istediğiniz dizini ile değiştirebilirsiniz.
  • fdBir dosya yerine bir dizin arıyorsanız değiştirilebilir.
  • -iname-namearamanın büyük / küçük harfe duyarlı olmasını istiyorsanız, bununla değiştirilebilir
  • *Eğer arama joker istemiyorsanız arama teriminde s atlanabilir

Bir alternatif:

find / -type f 2>/dev/null | grep "postgis-2.0.0"

Bu yol, eğer arama terimi tam dosya yolunda herhangi bir yerle eşleşirse, örneğin sonuçları verir. /home/postgis-2.0.0/docs/Readme.txt


2
Orada -regexve -iregexbirlikte aranması için anahtarlar Regular Expressionsyolu yanı bahseder bulur, hangi. Bir dosya ( -type f) olan herhangi bir öğeyi bulma önerisi grepdaha sonra kaynak açısından daha pahalıdır. Permission deniedKullanıcı dosyalara veya klasörlere erişmediğinde gerçekleşir, sudobulmadan önce kullanmak, tüm dosyaları görmeye izin verir.
sdkks

1
Regex anahtarları hakkında bilmek güzel, teşekkürler.
zanbri

@zanbri Boru bağlantısı yerine -wholenameveya -iwholenamekullanın grep.
wjandrea,

4

Deneyin find . -name "*file_name*"

  • '.' (Geçerli Dizin'e bakın) '/' (tüm sisteme bakın) veya '~ /' (Ana Dizin'e bakın) olarak değiştirebilirsiniz.

  • Küçük harfe duyarlı istemiyorsanız, "-name" ifadesini "-iname" olarak değiştirebilirsiniz.

  • Burada " file_name " (tam olarak ne ile başlayıp bitebilir bir dosya) dosyanın tam adını değiştirebilirsiniz.


3

Bu dosyanın yerini bulmayı kolaylaştırmalıdır:

Bu size dosyanın tam yolunu verir

tree -f  / | grep postgis-2.0.0

Ağaç, dizinlerin içeriğini ağaç benzeri bir biçimde listeler. -fdosyanın tam yolunu vermek için ağaç söyler. konumu veya ana konumu hakkında hiçbir fikrimiz olmadığından, dosya sistemi kökünden art /arda aşağı doğru arama yapmak iyidir . Ardından sözümüzü vurgulamak için çıktıyı grep'e göndeririz,postgis-2.0.0


0

findKomut, dizin ağacını yinelemeli olarak geçmenin en basit yolu olsa da, başka yollar vardır ve özellikle Ubuntu ile birlikte gelen iki komut dosyası dili zaten bunu yapabilir.

darbe

bashglobstardizin ağacının özyinelemeli geçişini sağlayan çok hoş bir kabuk seçeneğine sahiptir. Tek yapmamız gereken, ./**/*genişletmedeki öğenin bir dosya olup olmadığını ve istenen metni içerip içermediğini sınamaktır :

bash-4.3$ for f in ./**/* ;do [ -f "$f" ] && [[ "$f" =~ "postgis-2.0.0" ]] && echo "$f"; done 
./testdir/texts/postgis-2.0.0

Perl

Perl, dizin ağacının özyinelemeli geçişini ve alt yordam yoluyla bunlar üzerinde belirli bir eylem gerçekleştirmesini sağlayan Find modülüne sahiptir. Küçük bir komut dosyasıyla, dizin ağacını geçebilir, istediğiniz dizeyi içeren dosyaları dizinin içine itebilir ve ardından şöyle yazdırabilirsiniz:

#!/usr/bin/env perl
use strict;
use warnings;
use File::Find;

my @wanted_files;
find(
     sub{ 
         -f $_ && $_ =~ $ARGV[0]  
               && push @wanted_files,$File::Find::name
     }, "."
);

foreach(@wanted_files){
    print "$_\n"
}

Ve nasıl çalıştığını:

$ ./find_file.pl  "postgis-2.0.0"                                                       
./testdir/texts/postgis-2.0.0

piton

Python, Ubuntu dünyasında çok yaygın olarak kullanılan başka bir betik dilidir. Özellikle, os.walk()yukarıdaki - travers dizin ağacındaki gibi aynı işlemi yapmamızı ve istenen dizeyi içeren dosyaların listesini almamızı sağlayan modüle sahiptir.

Tek astar olarak bu şekilde yapılabilir:

$ python -c 'import os;print([os.path.join(r,i) for r,s,f in os.walk(".") for i in f if "postgis-2.0.0" in i])'                                                                         
['./testdir/texts/postgis-2.0.0']

Tam komut dosyası şöyle görünür:

#!/usr/bin/env python
import os;

for r,s,f in os.walk("."):
    for i in f:
        if "postgis-2.0.0" in i:
            print(os.path.join(r,i))

0

$ find . -type f | grep IMG_20171225_*

./03-05--2018/IMG_20171225_200513.jpg
Komuttan sonra DOT'u verir find, başlangıç ​​noktasını belirtmektir,
Hence - geçerli klasör,
isim filtresi üzerinden "piped" (= filtrelendi)IMG_20171225_*

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.