題 tar -C,帶有通配符文件模式


我可以使用tar命令更改目錄並使用通配符文件模式嗎?

這是我想要做的:

tar -cf example.tar -C /path/to/file *.xml

如果我不更改目錄(-C),它可以工作,但我正在嘗試避免tar文件中的絕對路徑。

tar -cf example.tar /path/to/file/*.xml

以下是我做過的其他一些嘗試:

tar -cf example.tar -C /path/to/file *.xml
tar -cf example.tar -C /path/to/file/ *.xml
tar -cf example.tar -C /path/to/file/ ./*.xml
tar -cf example.tar -C /path/to/file "*.xml"

這是我得到的錯誤:

tar: *.xml: Cannot stat: No such file or directory

我知道有其他方法可以使這項工作(使用find,xargs等),但我希望只使用tar命令來完成這項工作。

有任何想法嗎?


15
2018-04-04 14:10


起源




答案:


問題是,* .xml由shell解釋,而不是由tar解釋。因此,它找到的xml文件(如果有)位於您運行tar命令的目錄中。

您必須使用多階段操作(可能涉及管道)來選擇所需的文件,然後對它們進行tar。

最簡單的方法就是 cd 進入文件所在的目錄:

$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)

應該管用。

括號將命令組合在一起,因此當它們完成後,您仍將在原始目錄中。 &&表示 tar 只會在初始時運行 cd 那是成功的。


16
2018-04-04 14:22





在你的一次嘗試中:

tar -cf example.tar -C /path/to/file "*.xml"

*字符確實傳遞給tar。但問題是,tar僅支持對存檔成員名稱進行通配符匹配。因此,雖然在從存檔中提取或列出成員時可以使用通配符,但在創建存檔時不能使用通配符。

在這種情況下,我常常求助(就像你已經提到的那樣)。如果你有GNU find,它有一個很好的選擇,只使用-printf選項打印相對路徑:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'

7
2017-07-24 07:47