2016-01-03 139 views
0
I have a following structure: 

-folder1 
    -folder2 
    -file1 
    -file2 
    -folder3 
    -folder4 
     -folder5 
     -file3 
     -file4 

使用bash我需要在實際目錄,其中將包含4個文件(文件1,文件2,文件3,文件4)創建.tar歸檔文件。我嘗試過的所有東西都使用它們的路徑來存檔文件。我需要的是檔案只是文件,其中必須包含:tar文件沒有路徑

file1 
file2 
file3 
file4 
+1

您是否嘗試過--strip-components = n或--strip = n(在提取時使用),請參閱http://stackoverflow.com/questions/8043579/how-to-strip-path-while-archiving-與焦油? – user2672165

+0

@ user2672165不,因爲我不需要提取它,只是爲了創建 – Vlad

回答

2

如果知道文件名及其目錄,則可以使用-C/--directory選項讓tar在處理參數時更改其操作目錄。

所以這個命令:

tar -cf files.tar.gz -C folder1/folder2 file1 file2 -C ../folder3/folder4 file3 file4 

將與剛剛在它的文件的當前目錄下創建files.tar.gz

如果需要,您可以自動創建必要的命令行參數,從find輸出或類似的一點點腳本。

(不能使用通配符,如在文件參數位置folder1/folder2/*因爲在這些文件名的路徑將導致tar失敗找他們。你可以用在那個位置$(ls folder1/folder2/)但是這顯然不適合許多有效的文件名是安全的。)

0

簡單的解決方案是創建硬鏈接到/ tmp,然後從那裏存檔,像這樣:

mkdir /tmp/allfiles 
find /home/user/folder1 -type f | while read file 
do 
ln $file /tmp/allfiles 
done 
cd /tmp/allfiles 
tar cvf /tmp/myarchive.tar * 
rm /tmp/allfiles/* 
rmdir /tmp/allfiles 

注只有/ tmp和〜/ folder1在同一個文件系統上時,該硬鏈接纔會起作用。這隻會建立鏈接而不會消耗額外的磁盤空間。

您可能會首先刪除rm命令。腳本中的類型可能會導致不好的結果:-)。

+0

請注意,如果'/ tmp'位於單獨的文件系統上,則不能在文件系統上創建硬鏈接,但符號鏈接不正確無論是。 –

0

試試這個沒有創建任何臨時目錄:

find .type f | pax -wv -s '/.*\///g' -f file.tar 

man pax

PAX - 讀寫文件歸檔和複製目錄層次

+0

解釋標誌/參數和/或指向標誌文檔部分的鏈接在這裏會有所幫助。 –

+0

'man pax'加入 –

0

由於tar在建造時,存儲目錄結構,如果你不保留它們,你必須先刪除它們...

這樣做,你可以創建臨時目錄中存儲的符號鏈接在一個uniq的級別:

tmpdir=$(mktemp -d /tmp/tardir-XXXXXX) 
find $PWD -type f -exec ln -st $tmpdir {} + 
cd $tmpdir 
tar -chvf /tmp/myarchive.tar * 
cd - 
rm -fR $tmpdir 

諾塔:

  • $PWDfind到整個路徑鏈接到臨時目錄。
  • -h選項tar告訴他存儲指向文件而不是符號鏈接。
0

不是必須創建笨拙的鏈接或不帶通配符做,你可能可以創建你的檔案,然後改變這樣的目錄和追加到它(與r選項):

tar cvf ~/archive.tar file*        # make initial tarball 
(cd folder2 && tar rvf ~/archive.tar file*)   # append others to it 
(cd folder3/folder4 && tar -rvf ~/archive.tar file*) # and more... 

注我在subhell中做了上面的事情,以避免以後必須返回cd