Linux ค้นหาชื่อไฟล์ด้วยสตริงที่กำหนด


107

ฉันใช้ Ubuntu และฉันต้องการค้นหาไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อยที่ชื่อมีสตริง "John" ฉันรู้ว่าgrepสามารถจับคู่เนื้อหาในไฟล์ได้ แต่ฉันไม่รู้ว่าจะใช้กับชื่อไฟล์อย่างไร ความช่วยเหลือใด ๆ จะได้รับการชื่นชม


คำตอบ:


195

ใช้คำสั่งค้นหา

find . -type f -name "*John*"

1
การสร้างสคริปต์ทุบตีที่กำหนดเอง#!/bin/bash if [ -z $1 ]; then echo "Error: Specify pattern for search"; else /usr/bin/find . -type f -name "*$1*"; fi จะช่วยให้คุณสามารถเรียกใช้F search-stringเป็นทางลัดที่สมบูรณ์แบบได้
Ilia Rostovtsev

@IliaRostovtsev - ดี แต่[ -z "$1" ]จะดีกว่านี้หน่อย
โจ

@ เจ๊อ๊ะใช่เลย คุณหมายถึงในกรณีที่เส้นทางมีช่องว่าง? แต่ที่นี่เราตรวจสอบการมีอยู่ของพื้นที่ $ 1 เท่านั้นที่จะทำให้ $ 2 ปรากฏขึ้นและนั่นแหล่ะ คุณหมายความว่ามันดีกว่าในทางทฤษฎีใช่มั้ย?
Ilia Rostovtsev

@IliaRostovtsev - อันที่จริงฉันคิดผิด ถ้า $ 1 if [ -z ]เป็นโมฆะแล้วการทดสอบจะกลายเป็น ฉันคิดว่านั่นจะเป็นข้อผิดพลาดทางไวยากรณ์ แต่ก็ใช้ได้ ฉันสามารถลดความซับซ้อนของรหัสของฉันได้นับจากนี้
โจ

24

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

man -k <your search term>

สิ่งที่ทำคือการแสดงรายการคำสั่งทั้งหมดที่มีคำค้นหาของคุณในคำอธิบายสั้น ๆ โดยปกติจะมีโอกาสค่อนข้างดีที่คุณจะได้พบกับสิ่งที่คุณต้องการ ;)

บางครั้งผลลัพธ์นั้นอาจค่อนข้างท่วมท้นและฉันขอแนะนำให้ จำกัด ให้แคบลงเป็นไฟล์ปฏิบัติการแทนที่จะเป็นหน้าคนที่มีอยู่ทั้งหมดเช่น:

man -k find | egrep '\(1\)'

หรือหากคุณต้องการค้นหาคำสั่งที่ต้องการระดับสิทธิ์ที่สูงขึ้นเช่นนี้:

man -k find | egrep '\([18]\)'

3
ฉันสงสัย ... คำถามที่แสดงว่าไม่มีความพยายามในการแก้ไขปัญหาในมือผ่านการค้นหาได้รับการโหวตขึ้นคำอธิบายที่เป็นมิตรวิธีค้นหาคำสั่งที่เป็นไปได้จะถูกเหยียบย่ำ มีหลักเกณฑ์อย่างไร? :)
tink

1
ฉันโหวตให้คุณ บทเรียนมีน้อยคนที่จะทำได้ แต่เราสามารถดูตัวอย่างและปรับเปลี่ยนได้ :)
tgkprog

ใช่คำตอบนี้ควรได้รับการลงคะแนนเนื่องจากมันสวนทางกับแนวทางของ SO
Grand Phuba

ขอบคุณ @GrandPhuba - วิธีการมีคำถามที่ดำเนินการต่อต้านแนวทางเหล่านั้นไม่เพียง แต่ลดลง แต่ถูกลบ? ;)
tink

@tink มีคุณสมบัติการตั้งค่าสถานะและการโหวตลดลงสำหรับสิ่งนั้น สองผิดไม่ทำให้ถูก
Grand Phuba

2

findคำสั่งจะใช้เวลานานเพราะมันจะสแกนไฟล์ที่แท้จริงในระบบแฟ้ม

วิธีที่เร็วที่สุดคือใช้locateคำสั่งซึ่งจะให้ผลลัพธ์ทันที:

locate "John"

หากไม่พบคำสั่งคุณต้องติดตั้งmlocateแพ็กเกจและรันupdatedbคำสั่งก่อนเพื่อเตรียมฐานข้อมูลการค้นหาในครั้งแรก

ดูรายละเอียดเพิ่มเติมที่นี่: https://medium.com/@thucnc/the-fastest-way-to-find-files-by-filename-mlocate-locate-commands-55bf40b297ab



1

นี่เป็นวิธีแก้ปัญหาที่ง่ายมากโดยใช้treeคำสั่งในไดเร็กทอรีที่คุณต้องการค้นหา -fแสดงพา ธ ไฟล์แบบเต็มและ|ใช้เพื่อไพพ์เอาต์พุตของทรีgrepเพื่อค้นหาไฟล์ที่มีสตริงfilenameในชื่อ

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