파일의 특정 데이터 패턴과 일치하는 Zip 파일

파일의 특정 데이터 패턴과 일치하는 Zip 파일

파일로 가득 찬 디렉토리가 있습니다 *.CLM_01. 파일 내부에 값이 "005010X222"인 모든 파일을 포함하는 1개의 zip 파일을 만들고 싶습니다. 기본적으로 "005010X223"이 포함된 파일이 있는데 zip에서 제외하고 싶습니다. 그들은 상호 배타적입니다. 값은 파일 이름이 아닌 파일의 데이터에 있습니다.

이것을 시도했지만 여전히 모든 파일을 1개의 zip 파일로 압축합니다.

for f in *.CLM_01; do zip -ur test.zip $f | grep "005010X222" $f ; done

답변1

zshGNU 와 호환되거나 grep:

zip file.zip ${(0)"$(grep -l --null 005010X222 ./*.CLM_01)"}

grep를 사용하지 않지만 모든 --null파일 이름에 개행 문자가 포함되지 않도록 보장할 수 있는 경우:

zip file.zip ${(f)"$(grep -l 005010X222 ./*.CLM_01)"}

다른 POSIX 유사 셸의 경우, Split+glob 연산자를 사용하여 동일한 작업을 수행할 수 있습니다.

IFS='
' # split on newline
set -o noglob # disable glob
zip file.zip $(grep -l 005010X222 ./*.CLM_01)

그렇다면 다음을 bsdtar사용하여 표준 입력에 널로 구분된 파일 목록을 전달할 수도 있습니다 --null -T -.

grep -l --null 005010X222 ./*.CLM_01 | bsdtar --null -T - -acf file.zip

GNU 구현은 다음을 통해 자체적으로 재귀적으로 grep파일을 찾을 수도 있습니다.*.CLM_01

grep --include='*.CLM_01' -rl --null 005010X222 . |
  bsdtar --null -T - -acf file.zip

grep이 솔루션은 파일 경로가 or 에 인수로 전달되지 않기 때문에 명령에 전달되는 인수 수 제한의 영향을 받지 않습니다. bsdtar그러나 위의 glob 기반 솔루션과 달리 숨겨진 파일도 고려한다는 점에 유의하세요.

GNU의 경우 다음을 수행하는 파일 목록 grep도 참조하세요.grep -L 005010X223아니요005010X222를 포함하는 항목을 나열하는 대신 005010X223을 포함합니다 grep -l 005010X222.

답변2

find조용한 테스트와 함께 사용 grep:

find -name '*CLM_01' -exec grep -q '005010X222' {} \; -print0 | xargs -0 zip -u all_files.zip +

-qin은 grep조용한 옵션이며 일치하는 경우에만 성공합니다(종료 코드 0).

-u여러 번의 호출이 필요한 경우에도 가장 적합합니다 zip.xargszip

관련 정보