ค้นหาไฟล์ตามชื่อโดยใช้บรรทัดคำสั่ง


182

ฉันต้องการระบุตำแหน่งของไฟล์โดยใช้บรรทัดคำสั่ง ฉันเหนื่อย:

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

และ

locate postgis-2.0.0

ไม่มีประโยชน์ คำสั่งเพื่อกำหนดไดเรกทอรีของไฟล์คืออะไรให้ชื่อ?


2
locateคำสั่งเป็นได้เพียงแค่การปรับปรุง locatedb ครั้งแรกโดยใช้คำสั่งupdatedb
thucnguyen

หากติดตั้งแล้วชื่อไฟล์ใหม่อาจไม่อยู่postgis-2.0.0อีกต่อไป โดยปกติหลังจากการติดตั้งผ่านตัวจัดการแพคเกจไฟล์เรียกทำงานจะอยู่ใน$PATHโฟลเดอร์ใดโฟลเดอร์หนึ่งพยายามwhich postgisดูที่ตั้ง หากไม่มีสิ่งใดคืนมาคุณควรค้นหาที่ตั้งไฟล์ด้วยตนเอง
sdkks

คำตอบ:


231

ลองfind ~/ -type f -name "postgis-2.0.0"แทน

การใช้.จะค้นหาเฉพาะไดเรกทอรีปัจจุบัน ~/จะค้นหาไดเรกทอรีบ้านทั้งหมดของคุณ (เป็นไปได้ว่าคุณดาวน์โหลดไปที่ใด) หากคุณใช้wgetเป็นรูทอาจเป็นไปได้ที่อื่นดังนั้นคุณสามารถใช้/เพื่อค้นหาระบบไฟล์ทั้งหมด

โชคดี


1
โอ้ฉันใช้wgetเป็น root /ทำงานได้ดีขอบคุณ
Sam007

สำหรับข้อมูลเพิ่มเติมตรวจสอบลิงค์นี้help.ubuntu.com/community/find
habibun

ฉันค้นหา: / Users / ชื่อผู้ใช้ // ไลบรารี่ / สถานะแอปพลิเคชันที่บันทึกไว้ / com.bitrock.appinstaller.savedState: ข้อผิดพลาดการอนุญาตที่ถูกปฏิเสธ มันจะปรากฏขึ้นในทุกการดำเนินการของคำสั่ง จะกำจัดมันได้อย่างไร?
Eduard

29

ฉันจะพยายาม:

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

ส่วน หมายถึงค้นหาเฉพาะในไดเรกทอรีปัจจุบันเป็นการดีที่สุดที่จะค้นหาทุกอย่างจากรูทหากคุณไม่รู้จริงๆ นอกจากนี้ type -f หมายถึงค้นหาไฟล์ไม่ใช่โฟลเดอร์ การเพิ่มsudoอนุญาตให้ค้นหาในโฟลเดอร์ / โฟลเดอร์ย่อยทั้งหมด

ไวยากรณ์สำหรับของคุณlocateถูกต้อง แต่คุณอาจต้องเรียกใช้

sudo updatedb

เป็นครั้งแรก ไม่ว่าด้วยเหตุผลใดก็ตามฉันไม่เคยโชคดีlocateมาก่อน

locateupdatedbใช้ฐานข้อมูลไฟล์และไดเรกทอรีที่ทำโดย ดังนั้นหากคุณดาวน์โหลดไฟล์ใหม่มีโอกาสมากกว่าที่คุณupdatedbจะไม่ได้อัพเดตฐานข้อมูลของไฟล์และไดเรกทอรี คุณสามารถใช้sudo updatedbก่อนที่จะใช้locateโปรแกรมยูทิลิตี้ updatedbโดยทั่วไปจะทำงานวันละครั้งด้วยตัวเองบนระบบลินุกซ์


14

find เป็นหนึ่งในเครื่องมือ Linux / Unix ที่มีประโยชน์ที่สุด

ลอง find . -type d | grep DIRNAME


มีข้อได้เปรียบอะไรบ้างในการใช้ grep over-name?
TryHarder

@oooooo ฉันเพิ่มเหตุผลในคำตอบของฉันด้านล่าง
zanbri

พบบวก grep เป็นสิ่งเดียวที่ทำงานสำหรับฉัน
malhal

12

คำตอบอื่น ๆ เป็นสิ่งที่ดี แต่ฉันพบว่าการข้ามPermission deniedงบให้คำตอบที่ชัดเจนยิ่งขึ้น (ละเว้นstderrs เนื่องจากไม่ได้ทำงานsudo):

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

ที่อยู่:

  • / สามารถถูกแทนที่ด้วยไดเรกทอรีที่คุณต้องการเริ่มการค้นหา
  • fสามารถถูกแทนที่ด้วยdหากคุณกำลังค้นหาไดเรกทอรีแทนไฟล์
  • -inameสามารถถูกแทนที่ด้วย-nameหากคุณต้องการให้การค้นหาเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
  • *ในคำค้นหาที่สามารถละเว้นถ้าคุณไม่ต้องการสัญลักษณ์ในการค้นหา

ทางเลือกคือ:

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

วิธีนี้จะส่งคืนผลลัพธ์หากคำค้นหาตรงกับที่ใดก็ได้ในเส้นทางไฟล์ที่สมบูรณ์เช่น /home/postgis-2.0.0/docs/Readme.txt


2
มี-regexและ-iregexสวิตช์สำหรับค้นหาด้วยRegular Expressionsซึ่งจะค้นหาเส้นทางที่ระบุเช่นกัน คำแนะนำในการค้นหารายการใด ๆ ที่เป็นไฟล์ ( -type f) grepจะมีราคาแพงกว่า Permission deniedเกิดขึ้นเมื่อผู้ใช้ไม่สามารถเข้าถึงไฟล์หรือโฟลเดอร์การใช้sudoก่อนการค้นหาจะอนุญาตให้ค้นหาเพื่อดูไฟล์ทั้งหมด
sdkks

1
ดีที่รู้เกี่ยวกับสวิตช์ regex ขอบคุณ
zanbri

@zanbri ใช้-wholenameหรือแทนท่อไป-iwholename grep
wjandrea

4

ลอง find . -name "*file_name*"

  • ที่ที่คุณสามารถเปลี่ยน '.' (ดูในไดเรกทอรีปัจจุบัน) เป็น '/' (ดูในระบบทั้งหมด) หรือ '~ /' (ดูในไดเรกทอรีภายในบ้าน)

  • โดยที่คุณสามารถเปลี่ยน "-name" เป็น "-iname" หากคุณไม่ต้องการให้ตรงตามตัวพิมพ์ใหญ่ - เล็ก

  • โดยที่คุณสามารถเปลี่ยน " file_name " (ไฟล์ที่สามารถเริ่มต้นและสิ้นสุดด้วยชื่อไฟล์) เป็นชื่อไฟล์


3

สิ่งนี้ควรทำให้ตำแหน่งของไฟล์ง่ายขึ้น:

นี่จะให้เส้นทางแบบเต็มไปยังไฟล์ของคุณ

tree -f  / | grep postgis-2.0.0

ต้นไม้แสดงเนื้อหาของไดเรกทอรีในรูปแบบที่เหมือนต้นไม้ -fบอกต้นไม้เพื่อให้เส้นทางแบบเต็มไปยังแฟ้ม เนื่องจากเราไม่ทราบตำแหน่งหรือที่ตั้งหลักของมันจึงเหมาะที่จะค้นหาจากรูทของระบบไฟล์/ซ้ำ ๆ จากนั้นเราส่งผลลัพธ์ไปที่ grep เพื่อเน้นคำของเราpostgis-2.0.0


0

ในขณะที่findคำสั่งเป็นวิธีที่ง่ายที่สุดในการสำรวจทรีไดเรกทอรีซ้ำมีวิธีอื่นและโดยเฉพาะอย่างยิ่งภาษาสคริปต์สองภาษาที่มาพร้อมกับ Ubuntu โดยค่าเริ่มต้นแล้วมีความสามารถในการทำเช่นนั้น

ทุบตี

bash มีglobstarตัวเลือกเชลล์ที่ดีมากซึ่งอนุญาตให้ใช้การท่องวนซ้ำของแผนผังไดเรกทอรี สิ่งที่เราต้องทำคือการทดสอบว่ารายการในการ./**/*ขยายตัวเป็นไฟล์และไม่ว่าจะมีข้อความที่ต้องการ:

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 มีโมดูล Find ซึ่งอนุญาตให้ทำการสำรวจเส้นทางแบบทรีของไดเร็กตอรีทรีและผ่านรูทีนย่อยดำเนินการเฉพาะกับมัน ด้วยสคริปต์ขนาดเล็กคุณสามารถสำรวจแผนผังไดเรกทอรีกดไฟล์ที่มีสตริงที่ต้องการลงในอาร์เรย์แล้วพิมพ์ได้ดังนี้

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

และมันทำงานอย่างไร:

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

หลาม

Python เป็นภาษาสคริปต์อีกภาษาหนึ่งที่ใช้กันอย่างแพร่หลายในโลกของ Ubuntu โดยเฉพาะอย่างยิ่งมันมีos.walk()โมดูลที่ช่วยให้เราสามารถดำเนินการเช่นเดียวกับข้างต้น - ทรีไดเรกทอรีทราเวิร์และรับรายการของไฟล์ที่มีสตริงที่ต้องการ

ในฐานะที่เป็นหนึ่งซับนี้สามารถทำได้ดังนี้:

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

สคริปต์แบบเต็มจะมีลักษณะดังนี้:

#!/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
DOT หลังจากคำสั่งfindคือระบุจุดเริ่มต้น
ดังนั้น - โฟลเดอร์ปัจจุบัน
"piped" (= filtered) ผ่านตัวกรองชื่อIMG_20171225_*

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.