遞歸尋找不同存檔格式的所有存檔檔案並蒐索它們的檔案名稱模式

遞歸尋找不同存檔格式的所有存檔檔案並蒐索它們的檔案名稱模式

我最多希望有這樣的電話:

$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 你可能會使用路徑/至/搜尋

相關內容