ฉันต้องการค้นหาไฟล์ (ที่มีชื่อไฟล์ที่รู้จักกันบางส่วน) อยู่ในระบบไฟล์ ฉันต้องการทราบวิธีการทำสิ่งนี้จากบรรทัดคำสั่งแทนที่จะใช้ยูทิลิตี GUI
ใน Windows ฉันจะเรียกใช้สิ่งต่อไปนี้:
cd /d C:\
dir *filename* /s
Linux มีอะไรเทียบเท่า
ฉันต้องการค้นหาไฟล์ (ที่มีชื่อไฟล์ที่รู้จักกันบางส่วน) อยู่ในระบบไฟล์ ฉันต้องการทราบวิธีการทำสิ่งนี้จากบรรทัดคำสั่งแทนที่จะใช้ยูทิลิตี GUI
ใน Windows ฉันจะเรียกใช้สิ่งต่อไปนี้:
cd /d C:\
dir *filename* /s
Linux มีอะไรเทียบเท่า
คำตอบ:
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
เทียบเท่ากับตัวอย่าง DOS ของคุณจะเป็น:
cd /
find . -name \*filename\* -print
บน Linux คุณไม่จำเป็นต้องมี-print
ข้อโต้แย้งอีกต่อไปแล้ว หากคุณพบว่าตัวเองกำลังทำงานกับระบบปฏิบัติการอื่นมันอาจเป็นประโยชน์ที่จะรู้
หากคุณต้องการบางสิ่งที่"เร็ว"แต่ไม่ได้อยู่ในสถานการณ์ที่มีความสำคัญต่อภารกิจและคุณต้องการรู้ว่ามันมีอยู่จริงหรือไม่และอยู่ที่ไหนคุณสามารถใช้งานlocate
ได้ มันเก็บฐานข้อมูลของไฟล์ทั้งหมดในไดเรกทอรีที่คุณบอกให้รวบรวมข้อมูล
ในการติดตั้งเริ่มต้น (บน Ubuntu), locate
ตั้งค่าcron
งานประจำวันซึ่งสแกนระบบไฟล์และอัพเดทฐานข้อมูล ...
ถ้าคุณรู้สึกว่าคุณต้องการที่จะนำฐานข้อมูลถึงวันที่ก่อนที่จะปรับปรุง cron ต่อไปก็เป็นปกติได้เร็วกว่าfind
หรือls
เพื่อให้ทำงานได้เพียงแล้วsudo updatedb
locate
มันเร็วกว่าแน่นอนถ้าคุณต้องการค้นหาเพิ่มเติม ... ตามชื่อแนะนำupdatedb
อัพเดตฐานข้อมูลที่locate
ใช้ ...
locate
มี regex ในตัวซึ่งทำให้สะดวกมาก ... ฉันจะใช้find
สคริปต์ แต่ไม่ค่อยได้ใช้find
ที่ commandline ฉันยังใช้locate
สคริปต์ (ส่วนตัว) ... เช่นlocate -bir "oo.*datt.*mp4$"
locate
ส่งคืนพา ธ ที่ผ่านการรับรองโดยสมบูรณ์ของไฟล์ที่ตรงกัน
find [path] -name [filename]
ตัวอย่างเช่นถ้าฉันต้องการค้นหา / home directory สำหรับชื่อไฟล์ที่มี foo ฉันจะใช้คำสั่ง:
find /home -name *foo*
ใช้คำสั่งman find
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งค้นหาและข้อโต้แย้ง
*
s เพื่อป้องกันเชลล์จากการตีความ
ls
หรือไม่?