วิธีค้นหาไฟล์ในระบบไฟล์จากบรรทัดคำสั่ง?


10

ฉันต้องการค้นหาไฟล์ (ที่มีชื่อไฟล์ที่รู้จักกันบางส่วน) อยู่ในระบบไฟล์ ฉันต้องการทราบวิธีการทำสิ่งนี้จากบรรทัดคำสั่งแทนที่จะใช้ยูทิลิตี GUI

ใน Windows ฉันจะเรียกใช้สิ่งต่อไปนี้:

cd /d C:\
dir *filename* /s

Linux มีอะไรเทียบเท่า


เห็นได้ชัดว่ามีมากกว่าหนึ่งวิธีในการดูแลแมวตัวนี้ ฉันยังอยากรู้อยากเห็นเล็กน้อยหากมีวิธีการทำlsหรือไม่?
Iszi

คำตอบ:


13
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

(อ่านต่อสำหรับข้อกำหนดและเงื่อนไขหลักอ่านคู่มือสำหรับการพิมพ์แบบละเอียด)

lsรายการเนื้อหาของไดเรกทอรีเป็นชนิดของคุณลักษณะที่สองของ งานหลักของงานที่lsซับซ้อนมากที่สุดคือการปรับการแสดงผล (ดูคู่มือและเปรียบเทียบจำนวนตัวเลือกที่เกี่ยวข้องกับการเลือกไฟล์ที่จะแสดงเทียบกับจำนวนตัวเลือกที่ควบคุมข้อมูลที่จะแสดงเกี่ยวกับแต่ละไฟล์และการจัดรูปแบบการแสดงผลสิ่งนี้เป็นจริงทั้งGNU lsที่คุณ ' จะพบกับ Linux และระบบอื่น ๆ ที่มีตัวเลือกน้อยลงนับตั้งแต่วันแรก )

โหมดเริ่มต้นของlsคือเมื่อคุณผ่านไดเรกทอรีมันจะแสดงรายการไฟล์ในไดเรกทอรีนั้น หากคุณส่งไฟล์ประเภทอื่น ๆ (ไฟล์ปกติลิงก์สัญลักษณ์ ฯลฯ ) ไฟล์นั้นจะแสดงเฉพาะไฟล์นั้น (สิ่งนี้ใช้กับแต่ละอาร์กิวเมนต์แยกกัน) ตัวเลือก-dบอกว่าจะlsไม่ลงไปในไดเรกทอรี

lsไม่มีตัวเลือก-Rที่บอกให้รายการไดเรกทอรีซ้ำ แต่การบังคับใช้มี จำกัด และไม่อนุญาตให้กรองข้อมูลได้มากนัก

เครื่องมือแรกในการจับคู่รูปแบบคือเชลล์เอง คุณไม่ต้องการคำสั่งอื่น ๆ เพียงแค่พิมพ์ไวด์การ์ดและตั้งค่าไว้ นี้เป็นที่รู้จักกันglobbing

echo *filename*

ตามเนื้อผ้าสัญลักษณ์ถูก จำกัด ไปยังไดเรกทอรีปัจจุบัน (หรือไดเรกทอรีที่ระบุ: echo /some/where/*filename*) *ตรงกับชื่อไฟล์ใด ๆ หรือส่วนใดส่วนหนึ่งของชื่อไฟล์ แต่จะไม่ตรงกับ*.txt foo/bar.txtเชลล์สมัยใหม่ได้เพิ่มรูปแบบ**/ซึ่งหมายถึง“ ในไดเรกทอรีนี้หรือในไดเรกทอรีใด ๆ ด้านล่าง (เรียกซ้ำ)” ด้วย bash ด้วยเหตุผลด้านความเข้ากันได้ในอดีตคุณสมบัตินี้จำเป็นต้องเปิดใช้งานด้วยshopt -s globstar(คุณสามารถใส่บรรทัดนี้ไว้ในของคุณ~/.bashrc)

echo **/*filename*

echoคำสั่งเพียงแค่สะท้อนรายชื่อไฟล์ที่สร้างขึ้นโดยด้านหลังเปลือกที่คุณ เป็นข้อยกเว้นถ้าไม่มีชื่อไฟล์ที่ตรงกันเลยรูปแบบไวด์การ์ดจะไม่เปลี่ยนแปลงใน bash (ยกเว้นกรณีที่คุณตั้งไว้shopt -s nullglobซึ่งในกรณีที่รูปแบบขยายเป็นรายการว่าง) และสัญญาณ zsh ข้อผิดพลาด (เว้นแต่คุณจะตั้งค่าsetopt nullglobหรือsetopt no_no_matchซึ่งทำให้รูปแบบการเปลี่ยนแปลงไม่เปลี่ยนแปลง)

คุณอาจต้องการใช้lsสำหรับตัวเลือกต่าง ๆ ตัวอย่างเช่นlsสามารถบ่งชี้เกี่ยวกับลักษณะหรือการอนุญาตของไฟล์ (ไดเรกทอรีปฏิบัติการ ฯลฯ ) ผ่านสี ls -lคุณอาจต้องการที่จะแสดงวันที่ไฟล์ขนาดและความเป็นเจ้าของด้วย ดูคู่มือสำหรับตัวเลือกเพิ่มเติมมากมาย

findคำสั่งแบบดั้งเดิมที่จะมองหาไฟล์ในต้นไม้ไดเรกทอรีเป็น มันมาพร้อมกับตัวเลือกมากมายในการควบคุมไฟล์ที่จะแสดงและจะทำอย่างไรกับพวกเขา ตัวอย่างเช่นการค้นหาไฟล์ที่มีชื่อตรงกับรูปแบบ*filename*ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยและพิมพ์ชื่อ:

find /some/dir -name '*filename*' -print

-printเป็นการกระทำ (การกระทำอื่น ๆ ส่วนใหญ่ประกอบด้วยการดำเนินการคำสั่งในไฟล์); ถ้าคุณไม่ใส่การดำเนินการ-printบอกเป็นนัย ๆ นอกจากนี้หากคุณไม่ได้ระบุไดเรกทอรีใด ๆ ที่จะสำรวจ ( /some/dirด้านบน) ไดเรกทอรีปัจจุบันจะส่อให้เห็น เงื่อนไขแจ้ง-name '*filename'ว่าจะแสดงรายการ (หรือดำเนินการต่อ) เฉพาะไฟล์ที่มีชื่อตรงกับรูปแบบนั้น มีตัวกรองอื่น ๆ มากมายเช่น-mtime -1เพื่อให้ตรงกับไฟล์ที่แก้ไขใน 24 ชั่วโมงที่ผ่านมา บางครั้งคุณสามารถละเว้นเครื่องหมายอัญประกาศได้-name '*filename*'แต่หากสัญลักษณ์ตัวแทนไม่ตรงกับไฟล์ใด ๆ ในไดเรกทอรีปัจจุบัน (ดูด้านบน) สรุปสั้น ๆ คือ

find -name '*filename*'

อีกเครื่องมือที่มีประโยชน์เมื่อคุณรู้ (ส่วนหนึ่งของ) locateชื่อของไฟล์คือ เครื่องมือนี้ทำการสืบค้นฐานข้อมูลของชื่อไฟล์ ในระบบทั่วไปมันจะรีเฟรชทุกคืน ข้อได้เปรียบของlocateกว่าfind /ก็คือว่ามันเร็วมาก ข้อเสียคือข้อมูลอาจค้าง มีการใช้งานหลายอย่างlocateซึ่งแตกต่างกันในพฤติกรรมของพวกเขาในระบบผู้ใช้หลายคน: locateโปรแกรมพื้นฐานทำดัชนีเฉพาะไฟล์ที่สาธารณชนสามารถอ่านได้ (คุณอาจต้องการเรียกใช้คู่หูupdatedbเพื่อสร้างฐานข้อมูลที่สองที่ทำดัชนีไฟล์ทั้งหมดในบัญชีของคุณ) มีเวอร์ชันอื่น (mlocate, slocate) ที่ทำดัชนีไฟล์ทั้งหมดและให้locateโปรแกรมกรองฐานข้อมูลเพื่อส่งคืนไฟล์ที่คุณเห็นเท่านั้น

locate filename

บางครั้งคุณคิดว่ามีการจัดหาไฟล์โดยแพ็คเกจในการแจกจ่ายของคุณคุณรู้ชื่อ (ส่วนหนึ่ง) ของไฟล์ แต่ไม่ใช่ชื่อของแพ็คเกจของคุณและคุณต้องการติดตั้งแพคเกจ ดิสทริบิวชันจำนวนมากมีเครื่องมือสำหรับสิ่งนั้น บน Ubuntu apt-file search filenameก็ สำหรับคำสั่งเทียบเท่าในระบบอื่น ๆ ให้ตรวจสอบPacman Rosetta


หวังว่าฉันจะสามารถลงคะแนนนี้อีกครั้ง แค่ต้องค้นหาสิ่งนี้เพื่อโครงการอื่นคืนนี้ ขอขอบคุณอีกครั้ง @Gilles!
Iszi

6

เทียบเท่ากับตัวอย่าง DOS ของคุณจะเป็น:

cd /
find . -name \*filename\* -print

บน Linux คุณไม่จำเป็นต้องมี-printข้อโต้แย้งอีกต่อไปแล้ว หากคุณพบว่าตัวเองกำลังทำงานกับระบบปฏิบัติการอื่นมันอาจเป็นประโยชน์ที่จะรู้


5

หากคุณต้องการบางสิ่งที่"เร็ว"แต่ไม่ได้อยู่ในสถานการณ์ที่มีความสำคัญต่อภารกิจและคุณต้องการรู้ว่ามันมีอยู่จริงหรือไม่และอยู่ที่ไหนคุณสามารถใช้งานlocateได้ มันเก็บฐานข้อมูลของไฟล์ทั้งหมดในไดเรกทอรีที่คุณบอกให้รวบรวมข้อมูล

ในการติดตั้งเริ่มต้น (บน Ubuntu), locateตั้งค่าcronงานประจำวันซึ่งสแกนระบบไฟล์และอัพเดทฐานข้อมูล ...

ถ้าคุณรู้สึกว่าคุณต้องการที่จะนำฐานข้อมูลถึงวันที่ก่อนที่จะปรับปรุง cron ต่อไปก็เป็นปกติได้เร็วกว่าfindหรือlsเพื่อให้ทำงานได้เพียงแล้วsudo updatedb locateมันเร็วกว่าแน่นอนถ้าคุณต้องการค้นหาเพิ่มเติม ... ตามชื่อแนะนำupdatedbอัพเดตฐานข้อมูลที่locateใช้ ...

locateมี regex ในตัวซึ่งทำให้สะดวกมาก ... ฉันจะใช้findสคริปต์ แต่ไม่ค่อยได้ใช้findที่ commandline ฉันยังใช้locateสคริปต์ (ส่วนตัว) ... เช่นlocate -bir "oo.*datt.*mp4$"

locate ส่งคืนพา ธ ที่ผ่านการรับรองโดยสมบูรณ์ของไฟล์ที่ตรงกัน


2
find [path] -name [filename]

ตัวอย่างเช่นถ้าฉันต้องการค้นหา / home directory สำหรับชื่อไฟล์ที่มี foo ฉันจะใช้คำสั่ง:

find /home -name *foo*

ใช้คำสั่งman findสำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งค้นหาและข้อโต้แย้ง


3
คุณต้องอ้างหรือหลีกเลี่ยง*s เพื่อป้องกันเชลล์จากการตีความ
Shawn J. Goff

distro / shell นั้นเฉพาะเจาะจงหรือไม่? ฉันวิ่งใน Fedora 16 โดยไม่ต้องหลบหนีและใช้งานได้ดี
josh-cain

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