여러 zip 파일에서 하나의 파일을 추출합니다.

여러 zip 파일에서 하나의 파일을 추출합니다.

각각 4개의 파일이 포함된 여러 개의 .zip 폴더(약 600개)가 포함된 폴더 트리가 있습니다. 각 폴더에서 파일을 추출하여 별도의 폴더에 복사하고 싶습니다. 상황을 복잡하게 만들기 위해 각 폴더의 파일 이름은 동일합니다. 이 작업을 수행하기 위해 실행할 수 있는 스크립트가 있나요? 도움을 주시면 감사하겠습니다.

답변1

다음을 시도해 볼 수 있습니다.

mkdir -p "DESTDIR"
for i in *.zip ; do
         unzip "$i" "THEFILE" -d "DESTDIR"
         mv "DESTDIR/THEFILE" "DESTDIR/$(basename "$i" .zip)_THEFILE"
done

DESTDIR대상 경로로 바꿉니다. THEFILE추출하려는 각 .zip 파일의 파일 이름으로 바꿉니다 . zip 파일의 파일 이름에 따라 파일 이름이 변경됩니다.

답변2

정보 압축프로그램 unzip이 인식할 수 있다글로벌 모드파일 이름에. 따라서 zip 파일에 file1.gz서로 다른 폴더에 호출된 많은 파일이 포함되어 있는 경우:

$ unzip FolderName.zip '*/file1.gz'
Archive:  FolderName.zip
 extracting: FolderName/b/c/file1.gz          
 extracting: FolderName/b/e/file1.gz          
 extracting: FolderName/b/f/file1.gz 

FolderName.zipthings라는 파일도 포함되어 있음에도 불구하고다른비교하다 file1.gz. 원하는 파일을 glob 패턴과 일치시킬 수 있으면 unzip추출할 수 있습니다.

귀하의 다른 의견을 보면 추출된 파일을 모두 연결해야 한다는 인상을 받았습니다. 출력이 포함된 최상위 폴더의 unzip이름이 지정 되고 FolderName대상 파일( file1.gz)이 모든 하위 폴더의 동일한 폴더 깊이에 있다고 가정하면 다음과 같이 원하는 작업이 수행됩니다.

$ gzcat FolderName/*/*/file1.gz > one-big-uncompressed-log-file

즉, 두 개의 하위 폴더 수준을 건너뛰고 file1.gz파일을 추출한 다음 압축을 풀고 지원되는 대부분의 장소에서 찾을 수 gzcat있는 범용 프로그램과 연결합니다 .gzip

관련 정보