![여러 zip 파일에서 특정 파일의 압축 풀기](https://linux55.com/image/63747/%EC%97%AC%EB%9F%AC%20zip%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%ED%8A%B9%EC%A0%95%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%95%95%EC%B6%95%20%ED%92%80%EA%B8%B0.png)
저는 Unix를 처음 접했고 여러 zip 파일에서 특정 패턴 파일 이름을 추출하려고 합니다. 저는 find
zip 파일을 찾아서 zip 파일에 있는 CTL이라는 파일을 추출하려고 했습니다 a*b*zip
.
$ unzip -jn 'find $source_dir -mtime -$st_d -daystart -iname "a*zip"' \
*CTL* -d $target_dir`
이 외에도 다음을 사용해 보았습니다.
$ find -type f -newermt $start_date \! -newermt $end_date -name "a*zip" \
| while read filename; do unzip -d $target_dir; done;`
하지만 이것은 모든 파일을 추출하는 것이지만 파일 이름이 있는 파일만 찾고 있습니다.CTL.
답변1
단독으로 사용하면 간단하게 find -exec
이 작업을 수행 할 수 있습니다.
find . -type f -name '*.zip' -exec unzip {} '*CTL*' -d "$target_dir" \;
설명하다: -exec
{}
대체 파일 이름이 발견된 각 파일에 대해 다음 명령이 실행됩니다. 명령은 로 종료되어야 합니다 ;
. 쉘이 자체적으로 for의 종료로 해석되는 것을 방지하려면 끝에 \;
(';' 이스케이프)를 사용하고 대신 일반 텍스트로 전달하십시오.\
;
find
find
'*CTL*'
또한 파일 패턴이 인수로 전달될 때 파일 패턴을 따옴표 로 묶는 것이 가장 좋습니다 *CTL*
. 이렇게 하면 쉘이 파일 이름을 확장하지 않아도 됩니다. 예를 들어 이 경우 zip 파일 중 하나 abcCTL.zip
의 파일 이름에 CTL(예: )이 포함되어 있다고 가정해 보겠습니다 . *CTL*
패턴 만 사용하면 쉘이 패턴을 확장하고 패턴을 전달하는 대신 unzip
파일 이름을 전달하는데 abcCTL.zip
이는 분명히 원하는 것이 아닙니다.