ฉันจะค้นหาไฟล์ด้วยชื่อไฟล์ในเทอร์มินัล Mac OSX ได้อย่างไร


118

ฉันอยากพบไฟล์บน Macbook abc.dmgของฉันกับชื่อไฟล์: ฉันพยายามใช้สปอตไลท์ แต่ไม่พบ เมื่อฉันลองค้นหาและใช้: find -name abc.dmg -path /ฉันได้รับข้อผิดพลาดกลับมา

ไวยากรณ์ที่เหมาะสมในการค้นหาไฟล์ด้วยชื่อไฟล์พร้อมคำสั่ง find บนเทอร์มินัล Mac OSX คืออะไร


1
@VxJasonxV คำถามของ Apple เป็น 100% สำหรับหัวข้อสำหรับผู้ใช้ขั้นสูงและไม่จำเป็นต้องย้ายคำถามของ Apple ทุกคำถามไปที่นั่น คำถาม iPhone หรือ iPad จะถูกย้ายเมื่อ / หากจำเป็น
BinaryMisfit

มันไม่ได้เป็นเหตุผลมากนักที่อยู่นอกหัวข้อ แต่ความจริงที่ว่ามีหัวข้อ / ไซต์ที่เฉพาะเจาะจงมากขึ้นสำหรับเรื่องทั่วไป
VxJasonxV

@Diago: มีการอภิปรายเกี่ยวกับเรื่องนี้ในเมตาหรือแชท? เพิ่งสงสัยว่าแอปเปิ้ลของ AFAIK จะเปิดตัวเบต้าเร็ว ๆ นี้ดังนั้นจึงเป็นเรื่องดีที่จะได้รับทุกคนในหน้าเดียวกัน
Robert S Ciaccio

1
@calavera ค่อนข้างเก่า แต่การอภิปรายที่เกี่ยวข้องสามารถพบได้ที่นี่ Apple SE, Ubuntu SE และ Linux SE พร้อมรับคำชมจาก Super User แต่เราไม่ต้องการบังคับให้ผู้ใช้เคลื่อนที่ ฉันชอบถามคำถาม Apple ของฉันมากกว่า Apple เพราะฉันใช้ระบบปฏิบัติการ 3 ระบบ หากฉันมีคำถามที่เฉพาะเจาะจงฉันจะถามมันในเว็บไซต์ที่เฉพาะเจาะจงมากขึ้น
BinaryMisfit

คำตอบ:


163

ในรูปแบบที่ง่ายที่สุดfindใช้พารามิเตอร์เดียว: พา ธ ในรูปแบบที่มีประโยชน์จริงมันใช้เส้นทางตามเกณฑ์การ จำกัด

ดังนั้นคุณต้องการ:

  • find (โปรแกรม)
  • / (เส้นทาง) และ
  • -name abc.dmg (เกณฑ์)
find / -name abc.dmg

12
คุณอาจได้รับอนุญาตปฏิเสธข้อผิดพลาดประเภทเมื่อค้นหาไดรฟ์ทั้งหมด แต่พวกเขาสามารถถูกละเว้นเว้นแต่คุณคาดว่าไฟล์จะอยู่ในโฟลเดอร์ที่ถูก จำกัด ถ้าเป็นเช่นนั้นใช้sudo find / -name abc.dmg
Chris Nava

พยายาม แต่ไม่มีผลลัพธ์
SPRBRN

6
สมมุติว่าคุณไม่มีไฟล์ชื่อ abc.dmg ในคอมพิวเตอร์ของคุณ คุณสามารถใช้ -iname แทน -name เพื่อทำให้การค้นหาเล็กและใหญ่ ฉันสงสัยอย่างมากว่าคุณกำลังค้นหา "abc.dmg" และเนื่องจากข้อเท็จจริง (สมมุติ) จริง ๆ แล้วมันยากที่จะบอกคุณว่าปัญหาของคุณคืออะไรโดยไม่มีรายละเอียดที่แท้จริง
VxJasonxV

2
@rxt: ถ้าพบ dooesn't พบว่ามันก็ไม่ได้มี ...
โรเบิร์ตเอ Ciaccio

5
รายงานระบุว่า OP ได้พยายามหาในข้อความคำถามที่ว่ามันเป็นที่น่าสังเกตว่าคำสั่งของการขัดแย้งกับเรื่องfind find [path]+ [selection, grouping, and actions]หากจะต้อง
dmckee

23

find . -name '*.csv'เช่นทำงานให้ฉันด้วยสัญลักษณ์แทน OP ยังสามารถใช้ในการตรวจสอบไดเรกทอรีปัจจุบันของเขาสมมติว่าเขาอยู่ในfind . -name '*.dmg'/



6

คุณสามารถใช้locateคำสั่ง

locate abc.dmg

2
หมายเหตุosxแท็ก slocate db ไม่ได้เติมตามค่าเริ่มต้น
VxJasonxV

พยายามแล้วหลังจากสร้างฐานข้อมูล แต่ไม่มีผลลัพธ์
SPRBRN

หากlocateและmdfindทั้งสองล้มเหลวโอกาสที่ไฟล์จะไม่อยู่ในเครื่องของคุณ หรือไม่มีชื่อว่าคุณคิดอย่างไรกับชื่อ บางทีการค้นหา DMG ทั้งหมดอาจเป็นขั้นตอนต่อไปของคุณหรือไม่
ปอกเปลือก

3

วิธีที่ง่ายที่สุด (ซึ่งฉันแน่ใจว่าคุณได้ลองไปแล้ว แต่ขอให้ฉันเพิ่มลงในเธรดอยู่ดี) คือการใส่ abc.dmg ลงในช่องค้นหาที่ด้านบนขวาของหน้าต่างค้นหาใด ๆ จากนั้นเลือก "ไฟล์ ชื่อ "จากตัวเลือกบนแถบค้นหาที่ปรากฏขึ้น

ไม่จำเป็นต้องมีเครื่อง

โปรดจำไว้ว่าสปอตไลต์เฉพาะไดเรกทอรีดัชนีที่ระบุในแผงควบคุม Spotlight และ abc.dmg อาจไม่อยู่ในไดเรกทอรีใดไดเรกทอรีหนึ่ง

แก้ไขฉันถ้าฉันผิด แต่ฉันคิดว่าคำสั่ง find จำเป็นต้องรู้ว่าต้องเอาอะไรออก:

find / -name abc.dmg -print

... ควรพิมพ์ผลลัพธ์ใด ๆ ไปยังเทอร์มินัล (รวมถึงข้อผิดพลาดในการอนุญาต)

หากคุณไม่ต้องการข้อผิดพลาดในการอนุญาตและต้องการค้นหาไดเรกทอรีผู้ใช้อื่นให้ทำดังนี้

sudo find / -name abc.dmg -print

2

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

~/.bash_aliasesเพิ่มฟังก์ชั่นต่อไปนี้ใน

# find any item matching search query in file name
spot(){
  mdfind "kMDItemDisplayName=='*$1*'cd";
}

# restrict to files under (recursive) a specific path 
findpaper(){
    mdfind -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd";
}

# default to open the first entry unless 2nd positional argument is given
openpaper(){
    FILEID=$(printf "%sp" ${2:-1})

    open "$(mdfind -name -onlyin "/Users/foo/articles" "kMDItemDisplayName=='*$1*'cd" | sed -n "${FILEID}")"

}

ตอนนี้source ~/.bash_aliasesหรือเปิดฟังก์ชั่นโหลดเทอร์มินัลใหม่ หากต้องการค้นหาไฟล์ด้วยคำให้ใช้วงกลมและ 2016 ที่ใดก็ได้ในชื่อไฟล์ให้ทำ

spot pie*2016 #or
spot 2016*pie

ไม่จำเป็นต้องเสริมหรือต่อท้าย*แบบสอบถามของคุณเป็นรูปแบบการค้นหาติด'*$1*'แท็กรายการบัตรเสริมที่จุดเริ่มต้นและจุดสิ้นสุดของแบบสอบถามของคุณ เพิ่มเติมcdสำหรับกรณีตายและไม่สนใจเครื่องหมายกำกับเช่นfredจะส่งคืนทั้งFrédéricและ FrEDeric

findpaperจะ จำกัด การค้นหาผลลัพธ์ภายใต้เส้นทางที่เฉพาะเจาะจง (เรียกซ้ำ) ในขณะที่openpaper pie*201จะเปิด (หรือผลลัพธ์แรกของหลายผลลัพธ์) หรือopenpaper pie*201 3จะเปิดรายการผลลัพธ์ที่สาม เพื่อหลีกเลี่ยงการเปิดสคริปต์ทุบตีหรือไฟล์อื่น ๆ ที่ไม่ใช่เอกสารคุณอาจ จำกัด เนื้อหาไฟล์โดยใช้แอตทริบิวต์การค้นหาเพิ่มเติม ดูไวยากรณ์ของนิพจน์ของแบบสอบถามข้อมูลเมตาของไฟล์และhttps://ss64.com/osx/mdfind.htmlสำหรับการใช้โอเปอเรเตอร์การค้นหาอื่น ๆ


น่ากลัว! Stilling it: D
Atcold

0

จับรายชื่อของทุกไฟล์ในดิสก์ของคุณเป็นรูทจาก /

sudo find / &> ~/file-list.txt
sudo chown $(whoami) ~/file-list.txt

ทำการรวมไฟล์ทั้งหมดผ่าน grep เพื่อค้นหาไดรฟ์ทั้งหมด:

cat ~/file-list.txt | grep abc.dmg

ใช้นิพจน์ทั่วไปเพื่อแสดงเฉพาะไฟล์. jpg และ. dmg:

cat ~/file-list.txt | grep -E "(\.dmg|\.jpg)"

ผลลัพธ์:

Applications/Visualisations/CurvedSpaces-forMac.app/Contents/Resources/Textures/paper.jpg

... ฯลฯ แต่น่าเสียดายที่จะจับดิสก์ที่ติดตั้งทั้งหมดเพื่อให้ดีที่สุดที่จะนำ Time Machine เหล่านั้นออกซึ่งมีลิงก์จำนวนมาก ดังนั้นในหน้าต่างอื่นฉันรัน watch tail -n 10 ~/file-list.txtซึ่งแสดงให้ฉันเห็นว่ามันขึ้นอยู่กับการแฮ็คขี้ขลาดของฉัน!


1
การปฏิบัติที่ไม่ถูกต้องหรือสิ่งที่สมควรได้รับความคิดเห็น: (1) sudo find / > ~/file-list.txtดูเหมือนดีกว่าการใช้เชลล์ทั้งหมดในฐานะที่เป็นรูต (2) find *จะข้ามซ่อน (dot) วัตถุ /(ถ้ามี) (3) &>เป็นการทุบตี (4) catการใช้ประโยชน์ของ (5) จะพิมพ์เช่นgrep abc.dmg /foo/bar/123abcXdmg456/baz/whatever// สิ่งหนึ่งที่ดีที่คำตอบของคุณนำมาสู่เธรดนี้ (และคำตอบอื่น ๆ ไม่ได้) คือแนวทางที่ผู้ใช้รันfindครั้งเดียวจากนั้นนำผลลัพธ์ที่บันทึกซ้ำมาใช้ซ้ำหลายครั้งโดยไม่ต้องค้นหาระบบไฟล์ซ้ำแล้วซ้ำอีก ข้อดีที่เป็นไปได้นี้ไม่ได้เน้น
Kamil Maciorowski

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