Bash

在不同目錄的 tar 存檔中查找文件名

  • May 31, 2018

我想編寫一個批處理腳本:

  • 查找文件名
  • 文件名在 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.

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