2014-02-14 78 views
11

我試圖用一些文件創建一個tar檔案,但重命名檔案中的這些文件。現在,我有這樣的事情:如何使用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,你會看到文件:

  • TESTDIR/file1的
  • TESTDIR/file2的
  • TESTDIR /路徑/到/ renamedFile3
  • TESTDIR /等

我怎樣才能做到這一點?

回答

17

您可以用--transform修改文件名(除其他事項外)。例如,要創建一個磁帶歸檔/tmp/foo.tar,把文件/etc/profile/etc/bash.bashrc進去,同時更名profilefoo,你可以做到以下幾點:以上

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

結果是bar添加到file.tarfoo

r標誌表示轉換僅應用於常規文件。欲瞭解更多信息,請參閱GNU tar documentation

您可以使用--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 
+0

這肯定適用於重命名一個文件。如何重命名多個文件? –

+0

多重變換和/或非常聰明的正則表達式。 –

+0

你能給出一個多變換的例子。你只是多次寫'--transform = ...'嗎? –

1

隨着--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標誌爲關鍵,以保持從違反任何符號鏈接的目標在檔案中(這也符合^)變換。

0

在不喜歡我找到的任何解決方案之後,我只寫了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輸入簡單地使用輸出路徑作爲輸入,沒有重命名)

2

大家可以參考該男子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