我最多希望有這樣的電話:
$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"
……這樣這個工具
- 對給定路徑進行遞歸掃描
- 取得所有受支援的存檔格式的文件,這些格式至少應該是“最常見的”,例如 zip、rar、7z、tar.bz、tar.gz ...
- 並掃描存檔的文件清單以查找有問題的名稱模式(此處
*vacation*jpg
)
我知道如何使用查找工具、tar、解壓縮等。我可以將它們與 shell 腳本結合起來,但我正在尋找一種簡單的解決方案,可能是 shell 單行或專用工具(歡迎使用 GUI 工具的提示,但我的解決方案必須基於命令列)。
答案1
如果你想要比 AVFS 解決方案更簡單的東西,我編寫了一個 Python 腳本來完成它,稱為方舟查找。你實際上可以這樣做
$ arkfind /path/to/search/ -g "*vacation*jpg"
它將遞歸地執行此操作,因此您可以以任意深度查看檔案內的檔案。
答案2
(改編自如何遞歸地 grep 遍歷壓縮檔案?)
安裝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 限定詞會使模式擴展為空列表。
答案3
另一個有效的解決方案是zgrep
zgrep -r filename *.zip
答案4
我的通常解決方案:
find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|DESIRED_FILE_TO_SEARCH'
例子:
find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|characterize.txt'
結果如下:
foozip1.zip:
foozip2.zip:
foozip3.zip:
DESIRED_FILE_TO_SEARCH
foozip4.zip:
...
如果您只想要 zip 文件點擊數在上面:
find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|FILENAME' | grep -B1 'FILENAME'
檔案名稱這裡使用了兩次,所以可以使用變數。
透過 find 你可能會使用路徑/至/搜尋