題 如何在Mac OSX終端中按文件名查找文件?


我想在我的Macbook上找到一個文件名: abc.dmg。我試圖使用聚光燈,但它找不到它。當我嘗試查找,並使用: find -name abc.dmg -path /,我收到了錯誤。

在Mac OSX終端上使用find命令按文件名查找文件的正確語法是什麼?


84
2017-12-28 17:42


起源


@VxJasonxV蘋果問題是100%關於超級用戶的話題,並沒有真正需要將每個Apple問題都移到那裡。但是,如果需要,將移動iPhone或iPad的問題。 - BinaryMisfit
這不是一個偏離主題的原因,而是這個一般主題有一個更具體的主題/網站的事實。 - VxJasonxV
@Diago:關於元或聊天的討論有沒有?只是想知道因為AFAIK apple.SE很快就會推出測試版,所以讓每個人都在同一個頁面上會很高興。 - Robert S Ciaccio
@calavera。可以找到相當古老的討論,但相關 這裡。 Apple SE,Ubuntu SE和Linux SE都可以稱讚超級用戶,但我們絕不想強迫用戶移動。我更喜歡在這裡問蘋果問題,而不是Apple,因為我使用了3種不同的操作系統。如果我有一個非常具體的問題,我會在更專業的網站上提問。 - BinaryMisfit


答案:


最簡單的形式, find 採用一個參數:路徑。在其實際有用的形式中,它採用縮小標準的路徑。

因此,你想要:

  • find (該程序)
  • / (路徑)
  • -name abc.dmg (標準)。

find / -name abc.dmg


117
2017-12-28 17:45



搜索整個驅動器時,您可能會獲得權限被拒絕的類型錯誤,但除非您希望文件位於受限文件夾中,否則可以忽略它們。如果這樣使用 須藤 find / -name abc.dmg - Chris Nava
嘗試過,但沒有結果。 - SPRBRN
據推測,您的計算機上沒有名為abc.dmg的文件。您可以使用-iname而不是-name來使搜索大小寫不敏感。我非常懷疑你實際上是在搜索“abc.dmg”,並且考慮到(大概)事實,如果沒有實際細節,很難告訴你你的問題是什麼。 - VxJasonxV
@rxt:如果發現dooes找不到它,它就不存在...... - Robert S Ciaccio
鑑於OP報告已嘗試在問題文本中查找,值得注意的是參數的順序 find  事項。如果必須的話 find [path]+ [selection, grouping, and actions]。 - dmckee


find . -name '*.csv' 比如用通配符為我工作。 OP也可以使用 find . -name '*.dmg' 檢查他當前的目錄,假設他在 /


16
2017-10-27 14:11





mdfind 命令使用Spotlight數據庫

http://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/mdfind.1.html


7
2017-12-28 19:21



但根據OP的原始問題,Spotlight沒有找到它。 - VxJasonxV


你可以使用 locate 命令。

locate abc.dmg

6
2017-12-28 17:44



請注意 osx 標籤。 slocate db默認情況下不會填充。 - VxJasonxV
在創建數據庫之後嘗試了它,但沒有結果。 - SPRBRN
如果 locate 和 mdfind 兩者都失敗了,很可能文件不在你的機器上。或者它沒有命名你如何認為它的名字。或許搜索所有DMG可能是您的下一步? - peelman


最簡單的方法(我確定你已經嘗試了,但是嘿,讓我把它添加到線程中)是將abc.dmg輸入到任何finder窗口右上角的搜索框中,然後選擇“File”從顯示的搜索欄上的選項中命名“。

不需要終端。

另請記住,Spotlight僅索引Spotlight控制面板中指定的目錄,abc.dmg可能不在其中一個目錄中。

如果我錯了,請糾正我,但我認為find命令需要知道輸出什麼:

find / -name abc.dmg -print

...應該將任何結果打印到終端(包括權限錯誤)。

如果您不想要權限錯誤並想要搜索其他用戶目錄,那麼:

sudo find / -name abc.dmg -print

3
2017-12-28 22:53





您可以使用以下命令行功能快速查找和打開相關文件。我發現這比在聚光燈窗口中輸入長串查詢更容易。

添加以下功能 ~/.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 將打開第三個結果條目。為避免打開bash腳本或其他非文檔文件,您可以通過其他搜索屬性來限製文件內容。看到 文件元數據查詢表達式語法 和 https://ss64.com/osx/mdfind.html 用於使用其他搜索運算符。


1
2018-02-09 04:28