쓰기 전용 파일이 포함된 폴더가 있는데 압축할 때 해당 파일을 제외하고 싶습니다.
이러한 쓰기 전용 파일과 관련된 경고나 오류를 보고 싶지 않습니다.
가장 좋은 방법을 알려주십시오.
예:
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
파일 이름에 개행 문자가 포함되어 있으면 여기서 명령이 중단될 수 있다는 점을 명심하세요 . -@
옵션은 출력의 각 줄을 파일로 구문 분석하므로 공백은 문제가 되지 않습니다 .