파일 목록을 찾아 단일 zip 파일로 압축하는 방법은 무엇입니까?

파일 목록을 찾아 단일 zip 파일로 압축하는 방법은 무엇입니까?

내 프로젝트에 사용한 모든 파일을 수집하고 싶습니다. 저는 find명령을 사용하고 있으며 파일 목록을 찾은 다음 그 결과를 zip 명령에 전달하여 일치하는 모든 파일이 포함된 단일 zip 파일을 생성하길 원합니다. 가능하다면 단지 편의를 위해서입니다. 그러나 버그가 있어 작동하지 않는 것 같습니다.

find /lmms/samples/ -name warp01*,JR_effect2k*,clean_low_key*,q_kick_2*,sticky_q_kick*,upright_bass*,pizzi*,chorded_perc*,Tr77_kick*,Tr77_tom1*,Tr77_cym*,hihat_008a*,Hat_o.ds,Hat_c.ds,Kickhard.ds,Tr77_snare* -exec zip {} ~/Desktop/files.zip

출력은 다음과 같습니다

find: missing argument to `-exec'

추신.

아래 답변에서 지적된 오류 중 일부를 수정하고 해당 지침을 따른 후 다음과 같이 코드 형식을 다시 지정했습니다.

find ~/lmms/samples/ (-name warp01* -o -name JR_effect2k* -or -name clean_low_key* -or -name q_kick_2* -or -name sticky_q_kick* -or -name upright_bass*-or  -name pizzi* -or -name chorded_perc* -or -name Tr77_kick* -or -name Tr77_tom1* -or -name Tr77_cym* -or -name hihat_008a* -or -name Hat_o.ds -or -name Hat_c.ds -or -name Kickhard.ds -or  -name Tr77_snare*)  -exec zip -add  ~/Desktop/files.zip {} +

다음 메시지와 함께 여전히 실패합니다 bash: syntax error near unexpected token(' `

괄호를 제거하면 오류가 제거되지만 아카이브에 하나의 파일만 추가되는 것 같습니다. 놀랍게도 내 데스크톱에서는 찾을 수 없는 것 같습니다!

 find ~/lmms/samples/ -name warp01* -o -name JR_effect2k* -or -name clean_low_key* -or -name q_kick_2* -or -name sticky_q_kick* -or -name upright_bass*-or  -name pizzi* -or -name chorded_perc* -or -name Tr77_kick* -or -name Tr77_tom1* -or -name Tr77_cym* -or -name hihat_008a* -or -name Hat_o.ds -or -name Hat_c.ds -or -name Kickhard.ds -or  -name Tr77_snare*  -exec zip  ~/Desktop/files.zip {} +
  adding: home/john/lmms/samples/drumsynth/tr77/Tr77_snare.ds (deflated 49%)

답변1

-execfind두 개의 인수가 필요합니다. 실행할 명령과 명령이 일치할 때마다 한 번 실행되어야 하는지( ;) 또는 실행당 많은 파일을 사용해야 하는지( ) 나타내는 플래그입니다 +.

또한 zip매개변수의 방향이 잘못되었습니다.

테스트에서도 그렇지 않습니다 -name. 한 번에 하나의 모드만 필요합니다. 여러 패턴을 확인하려면 ("or") -name를 사용하여 여러 테스트를 결합 -o하고 괄호로 묶어야 합니다(감사합니다)시안이것을 지적하라):

find /lmms/samples/ \( -name "warp01*" -o -name "JR_effect2k*" ... \) -exec ...

(쉘 글로빙 문제를 방지하려면 각 패턴을 인용하십시오).

전체적으로 이름 테스트를 수정하고 다음 find으로 시작 하면

-exec zip ~/Desktop/files.zip {} +

올바른 일을 해야 합니다.

답변2

-exec또는 ( )를 사용하여 옵션을 종료하면 됩니다 . 귀하의 파일은 IIRC 아카이브에 넣은 파일보다 앞에 있어야 하므로 다음과 같습니다.;+man findzip

find ... -exec zip ~/Desktop/files.zip {} ;
find ... -exec zip ~/Desktop/files.zip {} +

+버전은 명령 끝에 매개변수를 집계하고 zip모든 파일에 대해 하나의 매개변수(또는 명령이 실제로 긴 경우 여러 매개변수)를 호출합니다. I/O 집약적이지만 마지막에 한 번만 사용할 수 있다는 단점이 있습니다. 이 버전은 더 유연하지만 각 파일이 필요합니다.zipzip{}+;zip

대체 솔루션을 찾을 수 없습니다.

또한 술어에 문제가 있습니다 -name. @StephenKitt가 올바른 구문을 제공했습니다.

zip예를 들어 globbing 패턴을 이해하는 기능을 사용하는 대체 구문은 을 file*사용하지 않으며 find원래 제안에 더 가깝고 익숙하지 않은 사람들에게는 오류가 덜 발생할 수 있습니다 find.

$ zip -r  ~/Desktop/files.zip /lmms/samples/ --include 'warp01*' 'JR_effect2k*' 'clean_low_key*' 'q_kick_2*' 'sticky_q_kick*' 'upright_bass*' 'pizzi*' 'chorded_perc*' 'Tr77_kick*' 'Tr77_tom1*' 'Tr77_cym*' 'hihat_008a*' 'Hat_o.ds' 'Hat_c.ds' 'Kickhard.ds' 'Tr77_snare*'

참고: 패턴을 공백으로 구분하세요. 주위에 따옴표는 필수입니다. 그렇지 않으면 .dll이 아닌 쉘에서 패턴을 해석할 수 있습니다 zip.

답변3

-print0 | xargs -r0성능과 "공백" 이유로 인해 다음과 같이 사용하는 것이 좋습니다 .

find /foo/bar -xdev -type f -mtime -2 -print0 | xargs -r0 zip "$HOME/foo-bar.zip"

귀하의 경우에는 다음과 같이 보일 것입니다

find /lmms/samples/ -name warp01*,JR_effect2k*,clean_low_key*,q_kick_2*,sticky_q_kick*,upright_bass*,pizzi*,chorded_perc*,Tr77_kick*,Tr77_tom1*,Tr77_cym*,hihat_008a*,Hat_o.ds,Hat_c.ds,Kickhard.ds,Tr77_snare* -print0 | xargs -r0 zip ~/Desktop/files.zip

관련 정보