Temukan file dengan nama menggunakan baris perintah

183

Saya ingin menentukan lokasi file menggunakan command-line. Saya telah mencoba:

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

dan

locate postgis-2.0.0

tidak berhasil. Apa perintah untuk menentukan direktori file, asalkan namanya?

Sam007
sumber
2
yang locateperintah baik-baik saja, hanya update locatedb pertama, menggunakan perintahupdatedb
thucnguyen
Jika sudah diinstal, nama file baru mungkin tidak postgis-2.0.0lagi. Biasanya setelah instalasi melalui manajer paket, file executable akan berada di salah satu $PATHfolder, coba which postgislihat lokasinya. Jika tidak mengembalikan apa pun, hanya Anda harus mencari lokasi file secara manual.
SDK

Jawaban:

232

Coba find ~/ -type f -name "postgis-2.0.0"saja.

Menggunakan .hanya akan mencari direktori saat ini. ~/akan mencari seluruh direktori home Anda (kemungkinan tempat Anda mengunduhnya). Jika Anda digunakan wgetsebagai root, kemungkinan itu bisa berada di tempat lain sehingga Anda bisa menggunakannya /untuk mencari seluruh sistem file.

Semoga berhasil

adempewolff
sumber
1
oh ya saya gunakan wgetsebagai root, jadi /terima kasih
Sam007
untuk lebih lanjut, periksa tautan ini help.ubuntu.com/community/find
habibun
Saya dapat menemukan: / Users / UserName // Perpustakaan / Status Aplikasi Tersimpan / com.bitrock.appinstaller.savedState: Izin ditolak kesalahan. muncul di setiap eksekusi perintah. Bagaimana cara menghilangkannya?
Eduard
29

Aku akan mencoba:

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

. berarti mencari hanya di direktori saat ini, yang terbaik adalah mencari semuanya dari root jika Anda benar-benar tidak tahu. Juga, ketik -f berarti mencari file, bukan folder. Menambahkan sudomemungkinkan untuk mencari di semua folder / subfolder.

Sintaks Anda locatesudah benar, tetapi Anda mungkin harus menjalankannya

sudo updatedb

pertama. Untuk alasan apa pun, saya tidak pernah beruntung locate.

locatemenggunakan basis data file dan direktori yang dibuat oleh updatedb. Jadi, jika Anda telah mengunduh file baru, kemungkinan Anda updatedbbelum memperbarui basis data file dan direktori. Anda dapat menggunakan sudo updatedbsebelum menggunakan locateprogram utilitas. updatedbumumnya berjalan sekali sehari dengan sendirinya di sistem linux.

reverendj1
sumber
14

find adalah salah satu alat Linux / Unix yang paling berguna.

Mencoba find . -type d | grep DIRNAME

Mitch
sumber
Apakah ada manfaat di sini untuk menggunakan grep over -name?
TryHarder
@oooooo Saya menambahkan alasan dalam jawaban saya di bawah ini
zanbri
find plus grep adalah satu-satunya hal yang berhasil untuk saya
malhal
12

Jawaban lainnya baik, tetapi saya menemukan Permission deniedpernyataan menghilangkan memberi saya jawaban yang lebih jelas (menghilangkan stderrkarena tidak berjalan sudo):

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

dimana:

  • / dapat diganti dengan direktori tempat Anda ingin memulai pencarian
  • fdapat diganti dengan djika Anda mencari direktori alih-alih file
  • -inamedapat diganti dengan -namejika Anda ingin pencarian menjadi case sensitif
  • yang *dalam istilah pencarian dapat dihilangkan jika Anda tidak ingin wildcard dalam pencarian

Alternatifnya adalah:

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

Dengan cara ini mengembalikan hasil jika istilah pencarian cocok di mana saja di jalur file lengkap, misalnya /home/postgis-2.0.0/docs/Readme.txt

Zanbri
sumber
2
Ada -regexdan -iregexsakelar untuk mencari Regular Expressions, yang akan menemukan jalur juga menyebutkan. Saran untuk menemukan item apa pun yang merupakan file ( -type f) maka grepsumber daya lebih mahal. Permission deniedterjadi ketika pengguna tidak memiliki akses ke file atau folder, menggunakan sudosebelum find akan memungkinkan find untuk melihat semua file.
SDK
1
Senang mengetahui tentang regex switch, terima kasih.
zanbri
@zanbri Gunakan -wholenameatau -iwholenamebukannya perpipaan ke grep.
wjandrea
4

Mencoba find . -name "*file_name*"

  • di mana Anda dapat mengubah '.' (lihat ke Direktori Saat Ini) ke '/' (lihat ke seluruh sistem) atau '~ /' (lihat ke Direktori Home).

  • di mana Anda dapat mengubah "-name" menjadi "-iname" jika Anda ingin tidak ada case sensitif.

  • di mana Anda dapat mengubah " file_name " (file yang dapat memulai dan diakhiri dengan apa pun itu) ke nama persis file tersebut.

RuiVBoas
sumber
3

Ini harus menyederhanakan lokasi file:

Ini akan memberi Anda path lengkap ke file

tree -f  / | grep postgis-2.0.0

Tree mencantumkan isi direktori dalam format mirip pohon. yang -fmengatakan pohon untuk memberikan path lengkap ke file. karena kita tidak tahu lokasi atau lokasi induknya, bagus untuk mencari dari root sistem file /secara rekursif ke bawah. Kami kemudian mengirim output ke grep untuk menyorot kata kami,postgis-2.0.0

ptetteh227
sumber
0

Sementara findperintah adalah cara paling sederhana untuk secara traverse melintasi pohon direktori, ada cara lain dan khususnya dua bahasa scripting yang datang dengan Ubuntu secara default sudah memiliki kemampuan untuk melakukannya.

pesta

bash memiliki globstaropsi shell yang sangat bagus , yang memungkinkan untuk melakukan traversal rekursif dari pohon direktori. Yang perlu kita lakukan adalah menguji apakah item dalam ./**/*ekspansi adalah file dan apakah itu berisi teks yang diinginkan:

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 memiliki modul Find, yang memungkinkan untuk melakukan traversal pohon direktori secara rekursif, dan melalui subrutin melakukan tindakan spesifik pada mereka. Dengan skrip kecil, Anda dapat melintasi pohon direktori, mendorong file yang berisi string yang diinginkan ke dalam array, dan kemudian mencetaknya seperti ini:

#!/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"
}

Dan cara kerjanya:

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

Python

Python adalah bahasa scripting lain yang digunakan sangat luas di dunia Ubuntu. Secara khusus, ia memiliki os.walk()modul yang memungkinkan kita untuk melakukan tindakan yang sama seperti pohon direktori traverse di atas dan mendapatkan daftar file yang berisi string yang diinginkan.

Sebagai one-liner, ini dapat dilakukan sebagai berikut:

$ 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']

Script lengkap akan terlihat seperti ini:

#!/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))
Sergiy Kolodyazhnyy
sumber
0

$ find . -type f | grep IMG_20171225_*
Memberi
./03-05--2018/IMG_20171225_200513.jpg
DOT setelah perintah finduntuk menyatakan titik awal,
Oleh karena itu - folder saat ini,
"piped" (= difilter) melalui filter namaIMG_20171225_*

Jadeye
sumber