파일로 가득 찬 디렉토리가 있습니다 *.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
zsh
GNU 와 호환되거나 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 +
-q
in은 grep
조용한 옵션이며 일치하는 경우에만 성공합니다(종료 코드 0).
-u
여러 번의 호출이 필요한 경우에도 가장 적합합니다 zip
.xargs
zip