簡體   English   中英

如何使用 linux 'tar' 重命名放入 tar 存檔的文件

[英]how to rename files you put into a tar archive using linux 'tar'

我正在嘗試用幾個文件創建一個 tar 存檔,但在存檔中重命名這些文件。 現在我有這樣的事情:

tar -czvf file1 /some/path/to/file2 file3 etc

但我想做類似的事情:

tar -czvf file1=file1 /some/path/to/file2=file2 file3=path/to/renamedFile3 etc=etc

當提取到目錄 testDir 時,您將在其中看到以下文件:

  • 測試目錄/文件1
  • 測試目錄/文件2
  • testDir/路徑/到/renamedFile3
  • 測試目錄/等

我怎樣才能做到這一點?

您可以使用--transform修改文件名(以及其他內容)。 例如,要創建磁帶存檔/tmp/foo.tar ,將文件/etc/profile/etc/bash.bashrc放入其中,同時將profile重命名為foo ,您可以執行以下操作:

tar --transform='flags=r;s|bar|foo|' -cf file.tar file1 file2 bar fubar /dir/*

上面的結果是bar被添加到file.tar作為foo

r標志表示轉換僅應用於常規文件。 有關更多信息,請參閱GNU tar文檔

您可以多次使用--transform ,例如:

tar --transform='flags=r;s|foo|bar|' --transform='flags=r;s|baz|woz|' -cf file.tar /some/dir/where/foo/is /some/dir/where/baz/is /other/stuff/* /dir/too

使用--transform ,不需要先創建臨時testDir。 要將testDir/前置到存檔中的所有內容,請匹配起始錨點^:

tar --transform "s|file3|path/to/renamedFile3|" \
    --transform "flags=r;s|^|testDir/|" \
    -czvf my_archive.tgz file1 /some/path/to/file2 file3 etc

r標志對於保持轉換不會破壞歸檔中的任何符號鏈接目標(也與^匹配)至關重要。

我們可以參考man tar-O選項是最好的選擇,因為文件可以寫成標准輸出。

-O      (x, t modes only) In extract (-x) mode, files will be written to
         standard out rather than being extracted to disk.  In list (-t)
         mode, the file listing will be written to stderr rather than the
         usual stdout.

以下是示例:

# 1. without -O
tar xzf 20170511162930.db.tar.gz
# result: 20170511162930.db

# 2. with -O
tar xzf 20170511162930.db.tar.gz -O > latest.db
# result: latest.db

在不喜歡我找到的任何解決方案后,我剛剛編寫了tarlogs.py ,它允許您為tar條目指定任意名稱。 每個tar條目由一個(或幾個)常規(或gzip)輸入構成。 您還可以添加目錄,這些目錄將與常規tar一樣被遞歸。 所以在你的情況下,

tarlogs.py -o file1 -i /some/path/to/file2 -o file2 -i file3 -o path/to/renamedFile3 -o /etc >output.tar

-o沒有-i輸入只使用輸出路徑作為輸入,沒有重命名)

這個問題已經有一段時間了,但對於正在尋找另一個合適解決方案的人來說:
我創建了一個原始 GNU tar 實用程序的分支,它額外支持文件名映射。

使用示例:

> touch myfile.txt
> tar cf file.tar ':myfile.txt:dir/inside/tar/newname.txt'
> tar tvf file.tar
  -rw-rw-r-- user/user      0  2022-02-12 14:27 dir/inside/tar/newname.txt

如上所示,該功能是通過在文件名前加上冒號 ( :來觸發的。 第二個冒號用作源文件位置和存檔內所需文件名之間的分隔符。

:[source file]:[desired name inside the tar]

此功能與-T (來自文件的輸入列表)標志兼容。

如何編譯它

> git clone https://github.com/leso-kn/tar
> cd tar
> ./bootstrap
> ./configure
> make -j4
# Run it
> src/tar --version

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM