2016-07-05 26 views
0

我試圖壓縮目錄中的一系列文件,但也打印壓縮文件的內容到標準輸出。如何gzip文件,同時也打印壓縮內容到標準輸出

鑑於本人:

09:00 /tmp/file1.txt 
10:00 /tmp/file2.txt 
11:00 /tmp/file3.txt 

我基本上希望執行gzip -c /tmp/file?.txt > /tmp/compressed.gz,但我也想將文件與保持原有的時間戳進行壓縮:

09:00 /tmp/file1.txt.gz 
10:00 /tmp/file2.txt.gz 
11:00 /tmp/file3.txt.gz 
12:00 /tmp/compressed.gz 

有任何方式使用一個命令做到這一點,並且不需要:

for i in $(ls /tmp/file?.txt) 
do 
     gzip ${i} && cat ${i}.gz >> /tmp/compressed.gz 
done 

我會l ike壓縮並寫入磁盤一次,並且不想再次點擊磁盤進行讀取。

+0

你可以用'gzip .. |寫入文件和stdout。 tee file.gz',你可以用'touch'設置時間戳。 –

+0

gzip適用於單個輸入文件,所以您需要使用類似tar的東西來首先創建歸檔。或者只是使用zip。 – Marichyasana

回答

1

這確實你問什麼在一條線:

ls file*.txt | xargs -n1 -I'{}' bash -c 'cat {} | gzip - | tee {}.gz >> compressed.gz; touch {}.gz -r {}' 

每個輸入文件從磁盤讀取一次,並且壓縮版本保存兩次;一次在其文件* .txt.gz條目中,一次在catch-all compressed.gz文件中。最後,它調整壓縮後gzip文件的時間戳。

請注意,這不會刪除原始txt文件。要壓縮後刪除每個文件:

ls file*.txt | xargs -n1 -I'{}' bash -c 'cat {} | gzip - | tee {}.gz >> compressed.gz; touch {}.gz -r {}; rm {}' 

測試的Linux系統上的lsxargsbashcatgzipteetouchrm的GNU版本。

0

未經測試的代碼

gzip不壓縮多個文件合併成一個。因此,您可能需要像tar這樣的程序先捆綁它然後壓縮。有一個選項可以保留tar中的訪問時間。

gzip file*.txt && tar --atime-preserve=replace -czvf file.tar.gz file*.txt 
相關問題