Find

遞歸查找各種歸檔格式的所有歸檔文件,並在其中搜尋文件名模式

  • October 31, 2017

充其量我想打這樣的電話:

$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"

它會遞歸地執行此操作,因此您可以查看檔案中的檔案到任意深度。

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