Find

“查找”說明說明

  • August 12, 2021

我有以下指示:

  1. 查找目錄中所有/x/y/z副檔名為.jpg.
  2. 將匹配文件名的列表(每行一個)寫入文件/x/y/file1.txt
  3. 確保您指定每個文件的絕對路徑。

你能幫助理解這個指令嗎?我最初想到使用以下命令:

find /x/y/z -name '*.jpg' -exec basename '{}' >> /x/y/file1.txt \;

但是,鑑於最後一條指令(…絕對路徑),我認為:

find /x/y/z -name '*.jpg' -exec pathname '{}' >> /x/y/file1.txt \;

哪個是對問題/指令的正確響應(命令)?

在這個答案中,我假設您的說明的第二點實際上是指“路徑名”而不是“文件名”。第三點沒有其他意義。

預設情況下,該find實用程序將輸出找到的文件的完整路徑,相對於頂級搜尋路徑。

在命令中

find /x/y/z -name '*.jpg' -print

find將列印出路徑名,如/x/y/z/foo/bar/baz.jpg. 如果頂級搜尋路徑是某個目錄的絕對路徑名,那麼輸出將自動是找到的文件的絕對路徑名。

另一方面,如果您正在使用

find x/y/z -name '*.jpg' -print

/(注意開頭缺少x/y/z),那麼您顯然會得到輸出的相對路徑名。

您可以使用 Linux 上的實用程序將這些轉換為絕對路徑名realpath

find x/y/z -name '*.jpg' -exec realpath {} +

這會呼叫realpath成批找到的路徑名。

在非 Linux 系統上,realpath如果安裝了 GNU coreutils,則可能會安裝相同的實用程序(但隨後可能會呼叫它grealpath)。

另見man realpath(或man grealpath)。


重新閱讀您的說明,其中沒有任何內容暗示您應該使用find. find如果您只關心單個目錄中的名稱,則不需要使用。

該練習也可以通過以下方式解決

printf '%s\n' /x/y/z/*.jpg >/x/y/file1.txt

.jpg這列出了以目錄結尾的所有名稱/x/y/z。如果您手頭沒有該目錄的絕對路徑,請使用

realpath x/y/z/*.jpg >/x/y/file1.txt

引用自:https://unix.stackexchange.com/questions/664444