Find
遞歸查找各種歸檔格式的所有歸檔文件,並在其中搜尋文件名模式
充其量我想打這樣的電話:
$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"
…所以這個工具
- 對給定路徑進行遞歸掃描
- 獲取所有具有受支持的存檔格式的文件,這些格式至少應該是“最常見的”,如 zip、rar、7z、tar.bz、tar.gz …
- 並掃描存檔的文件列表以查找有問題的名稱模式(此處
*vacation*jpg
)我知道如何使用查找工具、tar、解壓縮等。我可以將這些與 shell 腳本結合起來,但我正在尋找一個簡單的解決方案,它可能是 shell 單行或專用工具(歡迎使用 GUI 工具的提示,但我的解決方案必須基於命令行)。
(改編自How do I recursive grep throughcompressed archives?)
安裝AVFS,一個提供檔案內部透明訪問的文件系統。首先執行此命令一次以設置機器文件系統的視圖,您可以在其中訪問檔案,就像它們是目錄一樣:
mountavfs
在此之後,如果
/path/to/archive.zip
是一個可辨識的檔案,那麼~/.avfs/path/to/archive.zip#
是一個似乎包含檔案內容的目錄。find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \ -exec sh -c ' find "$0#" -name "*vacation*.jpg" ' {} 'Test::Version' \;
說明:
- 掛載 AVFS 文件系統。
- 在 中查找存檔文件
~/.avfs$PWD
,這是目前目錄的 AVFS 視圖。- 對於每個存檔,執行指定的 shell 片段(使用
$0
= 存檔名稱和$1
= 搜尋模式)。$0#
是檔案的目錄視圖$0
。{\}
而不是{}
在外部find
替代{}
內部-exec ;
參數的情況下需要(有些人這樣做,有些人不這樣做)。或者在 zsh ≥4.3 中:
mountavfs ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\'' reply=($REPLY\#/**/*vacation*.jpg(.N)) '\')
說明:
~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)
匹配目前目錄及其子目錄的 AVFS 視圖中的檔案。PATTERN(e\''CODE'\')
將 CODE 應用於 PATTERN 的每個匹配項。匹配文件的名稱在$REPLY
. 設置reply
數組會將匹配項轉換為名稱列表。$REPLY\#
是存檔的目錄視圖。$REPLY\#/**/*vacation*.jpg
匹配*vacation*.jpg
存檔中的文件。N
如果沒有匹配,glob 限定符使模式擴展為一個空列表。
如果您想要比 AVFS 解決方案更簡單的東西,我編寫了一個名為arkfind的 Python 腳本來完成它。你實際上可以做
$ arkfind /path/to/search/ -g "*vacation*jpg"
它會遞歸地執行此操作,因此您可以查看檔案中的檔案到任意深度。