2017-07-13 2 views
-1

Wie extrahiere ich eine bestimmte Datei aus Datenarchiven. Extrahieren bestimmter Datei aus Archiven gunzip

folder/test_files_20160101.zip.gz folder/test_files_20160102.zip.gz . . . folder/test_files_20170630.zip.gz

jeder ZIP-Ordner enthält file_1_20160101.txt file_2_20160101.txt file_3_20160101.txt

ich mit file_1_2016_2017.txt als Verkettung aller file_1_<YYYYMMDD>.txt Dateien einer einzigen Datei benötigen und die Kopfzeile aus jeder Datei überspringen.

+0

mögen Sie nur die Dateien extrahieren und sie in eine einzige externe Datei verketten oder ein Archiv an seinem Platz zu ändern? – RomanPerekhrest

+0

verketten Sie die Dateien in einer einzigen Datei – Dgstah

Antwort

0
[email protected]:~$ cd /tmp/ 

# create sample file 
[email protected]:/tmp$ seq 1 10 >file_1_20160101.txt 
[email protected]:/tmp$ seq 10 20 >file_2_20160101.txt 

# create tar 
[email protected]:/tmp$ tar -zcvf test1.zip.gz *.txt 
file_1_20160101.txt 
file_2_20160101.txt 

[email protected]:/tmp$ tar -zcvf test2.zip.gz file_2_20160101.txt 
file_2_20160101.txt 

# make sure they are created 
[email protected]:/tmp$ ls *.zip.gz 
test1.zip.gz test2.zip.gz 

# oneliner 
[email protected]:/tmp$ for i in *.zip.gz; do tar -xOzf "$i" --wildcards --no-anchored "file_1_*.txt" >tmpfile 2>>errorfile; [ "$?" -eq 0 ] && awk 'NR>1' tmpfile >>out_file || echo "Filename : $i" >>errorfile ; done ; rm tmpfile 

# output 
[email protected]:/tmp/testdir$ cat out_file 
2 
3 
4 
5 
6 
7 
8 
9 
10 

# error log 
[email protected]:/tmp$ cat errorfile 
tar: file_1_*.txt: Not found in archive 
tar: Exiting with failure status due to previous errors 
Filename : test2.zip.gz 

Besseren Lesbare

#!/usr/bin/env bash 

# create sample files 
seq 1 10 >file_1_20160101.txt 
seq 10 20 >file_2_20160101.txt 

# sample tar 
tar -zcvf test1.zip.gz *.txt 
tar -zcvf test2.zip.gz file_2_20160101.txt 

# list them 
ls *.zip.gz 

# delete if exists before because we are appending 
[ -f "errorfile" ] && rm errorfile 
[ -f "out_file" ] && rm out_file 

# loop through files, gnu tar is used 
for i in *.zip.gz; do 
     tar -xOzf "$i" --wildcards --no-anchored "file_1_*.txt" >tmpfile 2>>errorfile; 
     # if exit status is ok then skip header and append 
     # else append name of file to error file 
     [ "$?" -eq 0 ] && awk 'NR>1' tmpfile >>out_file || echo "Filename : $i" >>errorfile; 
done 

# clean 
rm tmpfile 
Verwandte Themen