Find
“查找”說明說明
我有以下指示:
- 查找目錄中所有
/x/y/z
副檔名為.jpg
.- 將匹配文件名的列表(每行一個)寫入文件
/x/y/file1.txt
。- 確保您指定每個文件的絕對路徑。
你能幫助理解這個指令嗎?我最初想到使用以下命令:
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