초기 상황 :
.
├── d0
├── f0
├── f1
│ └── d1
└── f2
└── f3
├── d2
├── d3
└── d4
내가해야 할 일:
다음 구조를 가져야하는 d0, d1 및 d4를 포함하는 zip을 만들고 싶습니다.
.
├── d0
├── d1
└── d4
내가 이미 시도한 것 :
나는 그것을 시도했다 zip myfiles d0 f1/d1 f2/f3/d4
. 그러나 이것은 원래 폴더 구조를 유지합니다. 원하는 것은 아닙니다.
.
├── d0
├── f1
│ └── d1
└── f2
└── f3
└── d4
질문
하위 폴더없이 여러 파일로 zip을 만드는 방법은 무엇입니까?
답변
수동으로 zip 파일을 작성하고 업데이트 할 수 있습니다.
zip myfiles d0
(cd f1; zip -u ../myfiles.zip d1)
(cd f2/f3; zip -u ../../myfiles.zip d4)
괄호는 서브 쉘을 작성하고 서브 쉘에서 cd
마지막 것의 영향 만으로 cd
원래 디렉토리 로 돌아갈 필요가 없습니다 .
경우 d1
, d2
등 실제로 파일이 아닌 디렉토리 자체가, 다음 사용 -j
옵션 :
-j
–junk-paths
저장된 파일의 이름 만 저장하고 (경로를 정크) 디렉토리 이름은 저장하지 마십시오. 기본적으로 zip은 현재 디렉토리에 상대적인 전체 경로를 저장합니다.
답변
당신이 사용할 수있는 find
파일 목록을 얻을하고 실행 zip -j myfiles
경로를 무시하고 그들을 팩 :
find . -name "d[014]" -exec zip -j myfiles {} +
예
$ tree
.
├── d0
├── f0
├── f1
│ └── d1
└── f2
└── f3
├── d2
├── d3
└── d4
$ find . -name "d[014]" -exec zip -j myfiles {} +
adding: d1 (stored 0%)
adding: d4 (stored 0%)
adding: d0 (stored 0%)
$ unzip -l myfiles.zip
Archive: myfiles.zip
Length Date Time Name
--------- ---------- ----- ----
0 2017-10-09 10:47 d1
0 2017-10-09 10:48 d4
0 2017-10-09 10:47 d0
--------- -------
0 3 files
그러나 이것은 파일에서만 작동하며 디렉토리는 무시됩니다 zip -j
. 너무 디렉토리에 대해이 작업을 얻으려면, 우리는 포장하고 싶은 말은 d0
, d1
전체 f3
위의 예에서 디렉토리는 find
라인이 좀 더 복잡해진다 :
$ find . \( -name "d[01]" -o -name "f3" \) -exec sh -c 'p=$(pwd); for i in $0 $@; do cd ${i%/*}; zip -ur "$p"/myfiles ${i##*/}; cd "$p"; done' {} +
zip warning: /home/dessert/myfiles.zip not found or empty
adding: d1 (stored 0%)
adding: f3/ (stored 0%)
adding: f3/d3 (stored 0%)
adding: f3/d2 (stored 0%)
adding: f3/d4 (stored 0%)
adding: d0 (stored 0%)
$ unzip -l myfiles.zip
Archive: myfiles.zip
Length Date Time Name
--------- ---------- ----- ----
0 2017-10-11 10:18 d1
0 2017-10-11 10:19 f3/
0 2017-10-11 10:19 f3/d3
0 2017-10-11 10:19 f3/d2
0 2017-10-11 10:19 f3/d4
0 2017-10-11 10:17 d0
--------- -------
0 6 files