Tìm một tệp theo tên bằng dòng lệnh


182

Tôi muốn xác định vị trí của tệp bằng dòng lệnh. Tôi đã thử:

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

locate postgis-2.0.0

không có kết quả. Lệnh để xác định thư mục của tập tin, được cung cấp tên của nó là gì?


2
các locatelệnh là tốt, chỉ cần cập nhật các locatedb đầu tiên, sử dụng lệnhupdatedb
thucnguyen

Nếu nó đã được cài đặt, tên tệp mới có thể không postgis-2.0.0còn nữa. Thông thường sau khi cài đặt thông qua trình quản lý gói, các tệp thực thi sẽ nằm trong một trong các $PATHthư mục, hãy thử which postgisxem vị trí. Nếu nó không trả về gì, chỉ sau đó bạn nên tìm vị trí tệp theo cách thủ công.
sdkks

Câu trả lời:


231

Hãy thử find ~/ -type f -name "postgis-2.0.0"thay thế.

Sử dụng .sẽ chỉ tìm kiếm thư mục hiện tại. ~/sẽ tìm kiếm toàn bộ thư mục nhà của bạn (có thể là nơi bạn đã tải nó xuống). Nếu bạn đã sử dụng wgetnhư root, có thể nó có thể ở một nơi khác để bạn có thể sử dụng /để tìm kiếm toàn bộ hệ thống tập tin.

Chúc may mắn


1
oh ya tôi đã sử dụng wgetnhư root để /làm việc cảm ơn
Sam007

để biết thêm kiểm tra liên kết này help.ubuntu.com/community/find
habibun

Tôi nhận được tìm thấy: / Users / UserName // Thư viện / Trạng thái ứng dụng đã lưu / com.bitrock.appinstaller.sattedState: Lỗi từ chối cấp phép. nó xuất hiện trên mỗi lần thực hiện lệnh. Làm thế nào để thoát khỏi nó?
Eduard

29

Tôi sẽ thử:

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

Các . có nghĩa là chỉ tìm kiếm trong thư mục hiện tại, tốt nhất là tìm kiếm mọi thứ từ root nếu bạn thực sự không biết. Ngoài ra, gõ -f có nghĩa là tìm kiếm tệp, không phải thư mục. Thêm sudocho phép nó tìm kiếm trong tất cả các thư mục / thư mục con.

Cú pháp của bạn locatelà chính xác, nhưng bạn có thể phải chạy

sudo updatedb

Đầu tiên. Vì lý do gì, tôi không bao giờ có may mắn với locatemặc dù.

locatesử dụng cơ sở dữ liệu của các tập tin và thư mục được thực hiện bởi updatedb. Vì vậy, nếu bạn đã tải xuống một tệp mới, có nhiều khả năng là bạn updatedbchưa cập nhật cơ sở dữ liệu của các tệp và thư mục. Bạn có thể sử dụng sudo updatedbtrước khi sử dụng locatechương trình tiện ích. updatedbthường chạy một lần một ngày trên các hệ thống linux.


14

find là một trong những công cụ Linux / Unix hữu ích nhất.

Thử find . -type d | grep DIRNAME


Có bất kỳ lợi thế nào ở đây để sử dụng grep over -name không?
TryHarder

@oooooo Tôi đã thêm một lý do trong câu trả lời của tôi dưới đây
zanbri

tìm cộng với grep là điều duy nhất làm việc cho tôi
malhal

12

Các câu trả lời khác là tốt, nhưng tôi thấy các Permission deniedcâu lệnh bỏ qua cho tôi câu trả lời rõ ràng hơn (bỏ qua stderrdo không chạy sudo):

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

Ở đâu:

  • / có thể được thay thế bằng thư mục bạn muốn bắt đầu tìm kiếm từ
  • fcó thể được thay thế bằng dnếu bạn đang tìm kiếm một thư mục thay vì một tập tin
  • -inamecó thể được thay thế bằng -namenếu bạn muốn tìm kiếm phân biệt chữ hoa chữ thường
  • các *s trong thời gian tìm kiếm có thể được bỏ qua nếu bạn không muốn ký tự đại diện trong việc tìm kiếm

Một thay thế là:

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

Cách này trả về kết quả nếu cụm từ tìm kiếm khớp với bất kỳ vị trí nào trong đường dẫn tệp hoàn chỉnh, ví dụ: /home/postgis-2.0.0/docs/Readme.txt


2
-regexvà các -iregexcông tắc để tìm kiếm Regular Expressions, trong đó cũng sẽ tìm thấy đề cập đường dẫn. Đề xuất tìm bất kỳ mục nào là một tệp ( -type f) thì greptốn nhiều tài nguyên hơn. Permission deniedxảy ra khi người dùng không có quyền truy cập vào tệp hoặc thư mục, sử dụng sudotrước khi tìm sẽ cho phép tìm thấy tất cả các tệp.
sdkks

1
Tốt để biết về các chuyển đổi regex, cảm ơn.
zanbri

@zanbri Sử dụng -wholenamehoặc -iwholenamethay vì đường ống đến grep.
wjandrea

4

Thử find . -name "*file_name*"

  • nơi bạn có thể thay đổi '.' (nhìn vào Thư mục hiện tại) thành '/' (nhìn vào toàn bộ hệ thống) hoặc '~ /' (nhìn vào Thư mục chính).

  • nơi bạn có thể thay đổi "-name" thành "-iname" nếu bạn không muốn phân biệt chữ hoa chữ thường.

  • nơi bạn có thể thay đổi " file_name " (một tệp có thể bắt đầu và kết thúc bằng bất cứ thứ gì) thành tên chính xác của tệp.


3

Điều này sẽ đơn giản hóa việc định vị tệp:

Điều này sẽ cung cấp cho bạn đường dẫn đầy đủ đến tập tin

tree -f  / | grep postgis-2.0.0

Cây liệt kê nội dung của các thư mục theo định dạng giống như cây. các -fbảo cây để cung cấp cho các đường dẫn đầy đủ đến tập tin. vì chúng tôi không biết vị trí của nó hoặc vị trí cha mẹ, nên tìm kiếm từ gốc hệ thống tập tin theo /cách đệ quy xuống. Sau đó chúng tôi gửi đầu ra cho grep để làm nổi bật từ của chúng tôi,postgis-2.0.0


0

Mặc dù findlệnh là cách đơn giản nhất để duyệt qua đệ quy cây thư mục, có một số cách khác và đặc biệt là hai ngôn ngữ kịch bản đi kèm với Ubuntu theo mặc định đã có khả năng thực hiện điều đó.

bash

bash có một globstartùy chọn shell rất đẹp , cho phép duyệt qua đệ quy của cây thư mục. Tất cả những gì chúng ta cần làm là kiểm tra xem mục trong bản ./**/*mở rộng có phải là một tệp hay không và liệu nó có chứa văn bản mong muốn hay không:

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 có mô-đun Find, cho phép thực hiện duyệt qua đệ quy của cây thư mục và thông qua chương trình con thực hiện hành động cụ thể trên chúng. Với một tập lệnh nhỏ, bạn có thể duyệt qua cây thư mục, đẩy các tệp có chứa chuỗi mong muốn thành mảng và sau đó in nó như sau:

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

Và cách thức hoạt động:

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

Con trăn

Python là một ngôn ngữ kịch bản khác được sử dụng rất rộng rãi trong thế giới Ubuntu. Đặc biệt, nó có os.walk()mô-đun cho phép chúng ta thực hiện hành động tương tự như trên - cây thư mục traverse và lấy danh sách các tệp chứa chuỗi mong muốn.

Như một lớp lót, điều này có thể được thực hiện như vậy:

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

Kịch bản đầy đủ sẽ trông như vậy:

#!/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_*
Cung cấp
./03-05--2018/IMG_20171225_200513.jpg
DOT sau lệnh findlà để nêu điểm bắt đầu, do
đó - thư mục hiện tại,
"piped" (= được lọc) thông qua bộ lọc tênIMG_20171225_*

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.