Bash
在不同目錄的 tar 存檔中查找文件名
我想編寫一個批處理腳本:
- 查找文件名
- 文件名在 tar 存檔中
- tar 存檔位於不同的目錄中
- 文件名匹配給定的模式
如果可能的話,我想避免去皮,並且想將文件名儲存在一個變數中。
./foo_tar
我的tar 文件位於bar.tar.gz
. 在 tar 存檔中,我想獲取以 開頭的文件的文件名baz*
,後跟一些數字和下劃線(例如baz1234_
)。到目前為止,我知道該
find
命令,但是在嘗試訪問 tar 文件時它不起作用。我想要這樣的東西:filename_in_question=$(find ./foo_tar/bar.tar.gz -name 'baz*')
有什麼解決方法嗎?
Tar 本身可以使用萬用字元
tar tzvf ./foo_tar/bar.tar.gz --wildcards '*/baz*'
例如。:
$ filename_in_question=$(tar tvf test.tar --wildcards '*/received_10205861111464136.mp4') $ echo $filename_in_question -rwxr-xr-x ghp/ghp 1931930 2017-11-04 10:36 ./Marieanne/Messenger/received_10205861111464136.mp4 $ echo ${filename_in_question/*\//} received_10205861111464136.mp4
find
僅搜尋存在於目錄層次結構中的文件,而不搜尋儲存在檔案中的文件。您可以列出文件tar -t
:tar -ztf ./foo_tar/bar.tar.gz --wildcards --no-anchored 'baz*'
--wildcards
允許*
被解釋為萬用字元,並--no-anchored
允許文件名在任何之後匹配/
(因此,如果它位於存檔的子目錄中,仍然可以找到它)。中的模式匹配
tar
不如 中的靈活find
。對於您描述的那種模式,您可以通過以下方式過濾完整內容grep
:tar -ztf ./foo_tar/bar.tar.gz | grep '\(^\|/\)baz[0-9]\+_'
由於要將結果保存在變數中,還需要使用Command Substitution將命令括起來:
filename_in_question=$(tar -ztf ./foo_tar/bar.tar.gz | grep '\(^\|/\)baz[0-9]\+_')
如果您使用的是
find
.