명령 행에서 여러 파일을 압축하는 방법은 무엇입니까?


16

이 가장 기본적인 질문은 용서하지만 스택 교환에 대한 직접적인 대답이나 간단한 예를 찾을 수 없습니다.

끔찍한 Windows 친구와 공유 할 수있는 하나의 zip 파일로 압축하고 싶은 파일 폴더가 있다고 가정 해 봅시다 (그렇지 않으면 그냥 사용 tar하고 끝내 겠습니다 ). 다음과 같이 보입니다 :

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg

내가 zip설치 했다고 가정하면 :

sudo apt-get install zip

man zip파일 목록을 사용할 수 있다는 것을 알았습니다 .

-@ 파일 목록. 파일 목록이-@ [MacOS 아님]으로 지정되면 zip은 명령 줄 대신 표준 입력에서 입력 파일 목록을 가져옵니다. 예를 들어

          zip -@ foo

그래서 zip.lst다음과 같은 것을 만들었습니다 .

cat zip.lst

file1.txt
file2.txt
file3.txt
file.jpg
test.jpg

그리고 지금 시도했습니다.

zip -@ zip.lst

그러나 콘솔에 빈 줄을 만드는 것 외에는 아무것도하지 않았습니다. 그리고 나는 계속 밀어 넣을 수 Enter있으며 명령을 실행하지 않고 더 빈 줄을 계속 만듭니다. 일부 검색 후 Ctrl+ 를 눌러 입력을 종료해야 함을 깨달았습니다.D

그러나 지금이 오류가 발생합니다 :

    zip warning: missing end signature--probably not a zip file (did you
    zip warning: remember to use binary mode when you transferred it?)
    zip warning: (if you are trying to read a damaged archive try -F)

zip error: Zip file structure invalid (zip.lst)

뭐!? 간단한 목록이 어떻게 "유효한 파일 구조"가 아닌가? 자세한 내용은 설명서로 돌아가서 자세히 살펴보십시오.

파일 목록이-@ ...로 지정된 경우

그래서 나는 그것을 시도하지 않고 -@적어도 Ctrl+ 를 누르지 않고 즉시 처리 D하지만 같은 오류가 남습니다 .

운 좋게도 나는 거의 관련이없는 질문에 대한 답변에 대한 의견 을 발견 하여 zip 파일의 이름을 명시 적으로 지정해야한다는 것을 깨달았습니다. 이 오류는 기본적으로이라는 zip 파일을 만들려고했기 때문에 발생했습니다 zip.lst. 그러나 그것이 내 목록의 이름이기 때문에 단순히 목록을 덮어 쓰겠다고 생각할 수도 있지만 실제로는 업데이트하려고 시도하지 않았습니다. 그리고 목록은 분명히 zip 파일이 아니기 때문에 유효하지 않은 파일 구조 오류가 발생하며 이제 왜 "zip 파일이 아닌 것"이라고 말했는지 분명합니다. 그래서 나는 시도했다 :

zip files.zip zip.lst

adding: zip.lst (deflated 35%)

유레카! zip 파일이 생성되었으며 내 폴더에 다음이 포함되어 있습니다.

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst

그러나 축하하기 전에 먼저 zip 파일의 내용을 확인하십시오.

unzip -l files.zip

Archive:  files.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       48  2016-05-24 15:30   zip.lst
---------                     -------
       48                     1 file

아니! 글쎄, 실제로 그것은 내가 준 하나의 목록 파일을 압축했기 때문에 표준 사용법에서 의미가 있습니다. 마침내 나는 다시 시도했지만 -@같은 결과를 얻었습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?

BTW, GUI를 사용하고 마우스로 할 수 있다는 것을 알고 있지만 스크립트를 작성해야하며 일반적으로 내가하는 일을 알면 CLI 속도가 빠릅니다.

답변:


23

파일 <리디렉션 사용

zip files.zip -@ < zip.lst

아니면 당신은 목록을 건너 뛸 수 있습니다

zip files.zip *.txt *.jpg

고마워 스틸 드라이버

역사적 답변

나는 내 눈물 자국 에서 뒤 따르는 다른 사람들이 키워드를 검색하여 절약 할 수 있기를 희망하면서 소란을 피하기를 원했기 때문에 내 자신의 질문에 대답 하는 것이 좋습니다.

결국, 나는 정답을 발견 했지만 잘못된 질문 에 게시되었습니다 .

몇 가지 명확성 :

  • 매뉴얼은 파일에서와 같이 리터럴 목록을 참조하는 것이 아니라 콘솔에서 파일을 나열하는 것을 의미합니다.
  • 누군가 foo파일 목록 을 참조한다고 생각하는 데 잘못 이해 될 수 있지만 실제로는 출력 zip 파일의 이름을 나타 내기위한 것입니다.
  • 그것이 사용하고 있으므로 파일의리스트가 예를 생략 -@하여 보여 스위치 "의 입력 파일 목록 얻어 표준 입력 대신으로부터 명령 라인 "

이를 이해하면서 우리는 목표를 달성하기위한 다양한 방법으로 무장했습니다.

먼저 생성 한 파일 목록을 사용하여 목록을 읽고 cat파이프를 사용하여 출력을 표준 입력 인 zip으로 리디렉션 할 수 있습니다 .

cat zip.lst | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

것을보고 adding: ...각 파일에 대해 확실히 좋은 기호이지만, 우리가 전에, 그래서 단지 확인을하자 우리의 희망을 했어 :

unzip -l files.zip

Archive:  files.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2016-05-24 14:54   file1.txt
        0  2016-05-24 14:54   file2.txt
        0  2016-05-24 14:54   file3.txt
        0  2016-05-24 15:00   file.jpg
        0  2016-05-24 14:59   test.jpg
---------                     -------
        0                     5 files

단! 그러나 어쨌든 누가 일회용 목록을 만들고 싶습니까? 이것이이 특정 시나리오를 해결하는 끔찍한 방법입니다. 목록을 가져 와서 lszip으로 파이프하는 것이 좋습니다 .

ls | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

굉장한! 이제 grepjpg를 압축 하는 놀라운 힘을 가진 필터를 만들어 봅시다 .

ls | grep .jpg | zip -@ images.zip

  adding: file.jpg (stored 0%)
  adding: test.jpg (stored 0%)

또는 "file"로 시작하는 파일

ls | grep file. | zip -@ files.zip

  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)
  adding: file.jpg (stored 0%)

5
대신에 사용하는 lsgrep및 우편의를 -@, 당신은 우편 명령 줄 예를 들어, 직접 파일을 선택 쉘 globs의를 사용할 수 있습니다 zip files.zip file*또는 zip images.zip *.jpg. 또한 파일에서 파일 이름 목록을 사용할 때 별도의 cat 프로세스를 호출하는 대신 리디렉션을 사용할 수 있습니다.zip files.zip -@ < zip.lst
steeldriver

파일과 함께 중첩 된 디렉토리로이 작업을 수행하려면 어떻게해야합니까?
BallpointBen

@BallpointBen find대신 사용ls
Jeff Puckett

6

최대 압축 수준의 가장 간단한 명령

zip -9 -r filename.zip /path/to/dir singlefile.jpg 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.