Komut satırını kullanarak bir dosyayı ada göre bulma

Komut satırını 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 belirlemek için komut nedir, adını sağladı mı?

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

Kullanım . yalnızca geçerli dizini arar. ~/ tüm giriş dizininizi arayacaktır (büyük olasılıkla indirdiğiniz yere). Eğer kullandıysan wget kök olarak, başka bir yerde olabilir, böylece kullanabilirsiniz / tüm dosya sistemini aramak için.

İyi şanslar

Denerdim.:

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

Bu. yalnızca geçerli dizinde arama yapmak anlamına gelir, gerçekten bilmiyorsanız her şeyi kökten aramak en iyisidir. Ayrıca, -f tipi, klasörleri değil dosyaları aramak anlamına gelir. Ekleme sudo tüm klasörlerde / alt klasörlerde arama yapmasına izin verir.

Sözdiziminiz locate doğru, ama kaçman gerekebilir.

sudo updatedb

ilk. Her ne sebeple olursa olsun, asla şansım yaver gitmez. locate rağmen.

locate tarafından yapılan dosya ve dizinlerin veritabanını kullanır updatedb. Yani yeni bir dosya indirdiyseniz, daha fazla şansınız var updatedb dosya ve dizin veritabanını güncelleştirmedi. Kullanabilirsiniz sudo updatedb kullanmadan önce locate yardımcı program.updatedb genellikle linux sistemlerinde günde bir kez kendi başına çalışır.

Diğer cevaplar iyi, ama atlamayı buluyorum Permission denied ifadeler bana daha net cevaplar veriyor (atlar stderrs çalışmadığı için sudo):

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

nerede:

  • / aramanızı başlatmak istediğiniz dizin ile değiştirilebilir
  • f ile değiştirilebilir d dosya yerine dizin arıyorsanız
  • -iname ile değiştirilebilir -name aramanın büyük / küçük harfe duyarlı olmasını istiyorsanız
  • bu *aramada joker karakterler istemiyorsanız, arama terimindeki karakterler atlanabilir

Bir alternatif:

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

Bu şekilde, arama terimi tam dosya yolunun herhangi bir yerinde eşleşirse sonuçları döndürür, örn. /home/postgis-2.0.0/docs/Readme.txt

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

Denemek find . -type d | grep DIRNAME

Denemek find . -name "*file_name*"

  • değişebileceğin bir yer.'(geçerli Dizine bakın) '/' (tüm sisteme bakın) veya '~ /' (Giriş Dizinine bakın).

  • büyük / küçük harfe duyarlı olmasını istemiyorsanız "-name" değerini "-iname" olarak değiştirebilirsiniz.

  • değişebileceğin yer "dosya_adı"(ne olursa olsun başlayıp bitebilen bir dosya) dosyanın tam adına.

Bu, dosyanın yerini basitleştirmelidir:

Bu size dosyanın tam yolunu verecektir

tree -f  / | grep postgis-2.0.0

Tree dizinlerin içeriğini ağaç benzeri bir biçimde listeler. bu -f tree'ye dosyanın tam yolunu vermesini söyler. konumu veya üst konumu hakkında hiçbir fikrimiz olmadığından, dosya sistemi kökünden arama yapmak iyi olur / yinelemeli olarak aşağı doğru.Daha sonra sözümüzü vurgulamak için çıktıyı grep'e göndeririz, postgis-2.0.0

Karşın find komut, dizin ağacını yinelemeli olarak geçmenin en basit yoludur, başka yollar da vardır ve özellikle varsayılan olarak Ubuntu ile birlikte gelen iki betik dili zaten bunu yapma yeteneğine sahiptir.

deneme

bash çok güzel bir tadı var globstar dizin ağacının özyinelemeli geçişine izin veren kabuk seçeneği. Tek yapmamız gereken, ürünün içinde olup olmadığını test etmektir. ./**/* genişleme bir dosyadır ve istenen metni içerip içermediği:

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

Perlname

Perl, dizin ağacının özyinelemeli geçişini gerçekleştirmeye ve alt yordam aracılığıyla üzerinde belirli eylemler gerçekleştirmeye izin veren Find modülüne sahiptir. Küçük bir komut dosyasıyla, dizin ağacını geçebilir, istediğiniz dizeyi içeren dosyaları diziye itebilir ve daha sonra bu şekilde yazdırabilirsiniz:

#!/usr/bin/env perluse 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ışır:

$ ./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, sahip olduğu os.walk() yukarıdaki ile aynı işlemi gerçekleştirmemize izin veren modül - dizin ağacını geç ve istenen dizeyi içeren dosyaların listesini al.

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ürdü:

#!/usr/bin/env pythonimport 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))

$ find . -type f | grep IMG_20171225_*
Verir
./03-05--2018/IMG_20171225_200513.jpg
Komuttan sonraki nokta find bir başlangıç noktası belirtmektir,
Dolayısıyla - geçerli klasör,
ad filtresinden "borulu" (= filtrelenmiş) IMG_20171225_*

‘locate’ komutu iyi, sadece updatedb komutunu kullanarak önce locatedb’yi güncelleyin

Zaten yüklüyse, yeni dosya adı artık ‘postgıs-2.0.0’ olmayabilir. Genellikle paket yöneticileri aracılığıyla kurulumdan sonra, yürütülebilir dosyalar $ PATH klasörlerinden birinde olur, konumu görmek için hangi postgıs'i deneyin. Hiçbir şey döndürmezse, ancak o zaman dosya konumunu manuel olarak aramalısınız.