Zip -r을 사용하고 읽기 권한이 없는 파일을 제외/무시하려고 합니다.

Zip -r을 사용하고 읽기 권한이 없는 파일을 제외/무시하려고 합니다.

쓰기 전용 파일이 포함된 폴더가 있는데 압축할 때 해당 파일을 제외하고 싶습니다.

이러한 쓰기 전용 파일과 관련된 경고나 오류를 보고 싶지 않습니다.

가장 좋은 방법을 알려주십시오.

예:

sh:~/t12$ ls -l
total 0
--w--w--w- 1 som  som 0 Dec  5 05:59 a
-rw-rw-r-- 1 som  som 0 Dec  5 05:59 b
-rw-rw-r-- 1 som  som 0 Dec  5 05:59 c

sh:~/t12$ zip -r zipFileName /home/som/t12/*
  adding: home/som/t12/a
zip warning: Permission denied
    zip warning: could not open for reading: home/som/t12/a
  adding: home/som/t12/b (stored 0%)
  adding: home/som/t12/c (stored 0%)

zip warning: Not all files were readable
  files/entries read:  2 (0 bytes)  skipped:  1 (0 bytes)

답변1

나는 다음과 같은 것을 시도할 것이다:

find . -readable -type f -exec zip -q zipFileName {} +

주문하다:

find . -readable -type f

읽기 권한이 있는 모든 파일을 반환합니다 ..

두 번째 부분

-exec zip -q zipFileName {} +

zip찾은 파일 이름을 제공하는 명령을 실행합니다 .

답변2

zip읽을 수 있는 확장 파일 목록을 제공하면 경고를 피할 수 있습니다.

zsh에서는 다음과 같습니다:

zip -r zipFileName /home/som/t12/**/*(.r)

쉘로 zsh로 변경할 필요가 없습니다. 다음을 호출할 수 있습니다.

zsh -c 'zip -r zipFileName /home/som/t12/**/*(.r)'

그 이후의 와일드카드 패턴은 다음 /home/som/t12/과 같습니다.

  • **/*-- 각 파일과 디렉터리가 목록으로 확장되도록 재귀를 활성화합니다.
  • (.r)-- 확장자 목록을 일반 파일( 사용 .)로 제한하는 glob 한정자 및 -- 이 질문에서 결정적으로 -- 현재 사용자가 읽을 수 있는 파일( 사용 r)

최종 결과는 zip명령줄이 다음과 같다는 것입니다.

zip -r zipFileName home/som/t12/b home/som/t12/c ...

... ...이 디렉토리에서 읽을 수 있는 (일반) 파일 목록은 어디에 있습니까?

여기서 부작용은 와일드카드 확장이 디렉터리와 명시적으로 일치하지 않는다는 점입니다. 따라서 이전 솔루션에서는 zip -r zipFileName /home/som/t12/zip 파일에 디렉터리 항목이 포함되지만 위 솔루션에서는 그렇지 않습니다. 이러한 하위 디렉터리의 파일은 전체 경로와 함께 zip 파일에 계속 표시됩니다.


쓰기 전용 파일 이름을 미리 알고 있는 경우 다음 zip을 사용하여 제외할 수 있습니다.

zip -r zipFileName /home/som/t12/ -x /home/som/t12/a -x /home/som/t12/any/other/files ...

... -x플래그는 zip제외할 파일을 알려주며 해당 경로가 zip에 제공한 경로와 일치하는지 확인하세요.

답변3

한 가지 방법은 압축을 사용할 파일 목록을 생성한 find다음 옵션을 zip사용하여 -@전달하는 것입니다 .

예를 들어 다음 레이아웃을 고려해보세요.

$ ls -l . test2/
.:
total 0
--w--w--w-  1 testuser testuser 0 Dec  5 21:26 a
-rw-rw-r--  1 testuser testuser 0 Dec  5 21:26 b
-rw-rw-r--  1 testuser testuser 0 Dec  5 21:26 c
drwxr-xr-x+ 1 testuser testuser 0 Dec  5 21:31 test2

test2/:
total 0
--w--w--w- 1 testuser testuser 0 Dec  5 21:31 a
-rw-rw-r-- 1 testuser testuser 0 Dec  5 21:26 b
-rw-rw-r-- 1 testuser testuser 0 Dec  5 21:26 c

그런 다음 이 find명령을 사용하여 쓰기 전용 권한 유형(8진수로 222)을 가진 파일을 제외할 수 있습니다.

$ find . -type f ! -perm 222
./b
./c
./test2/b
./test2/c

다음 파일을 에 전달하여 zip아카이브로 압축합니다.

$ find . -type f ! -perm 222 | zip myfile.zip -@
  adding: b (stored 0%)
  adding: c (stored 0%)
  adding: test2/b (stored 0%)
  adding: test2/c (stored 0%)

아카이브를 확인하십시오.

$ unzip -l myfile.zip
Archive:  myfile.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  12-05-2019 21:26   b
        0  12-05-2019 21:26   c
        0  12-05-2019 21:26   test2/b
        0  12-05-2019 21:26   test2/c
---------                     -------
        0                     4 files

find파일 이름에 개행 문자가 포함되어 있으면 여기서 명령이 중단될 수 있다는 점을 명심하세요 . -@옵션은 출력의 각 줄을 파일로 구문 분석하므로 공백은 문제가 되지 않습니다 .

관련 정보