5

Как мне сделать zip из всех файлов и подкаталогов в каталоге mydir , кроме всех тех файлов / каталогов, которые начинаются с .*?

Команда:

zip -r mydir.zip mydir/

... будет включать в себя все. Например, если у меня есть:

mydir/foo
mydir/bar
mydir/.hello

Я бы хотел, чтобы foo и bar были включены в mydir , но не .hello.

Как я могу это сделать?

6 ответов6

8

Это работает для меня:

zip -r mydir.zip mydir -x "*/.*"

@Joe Internet, @Dariusz: нормальные шаблоны оболочки не будут работать должным образом, потому что zip сопоставляется с полным путем + именем файла внутри (как объясняется в руководстве по zip ... ;))

1

Следующий подход работает для этого типа дерева каталогов:

$ tree .
.
├── adir1
│   ├── afile1
│   ├── afile2
│   ├── afile3
│   └── afile4.txt
├── adir2
│   ├── afile1
│   ├── afile2
│   ├── afile3
│   └── afile4.txt
├── adir3
│   ├── afile1
│   ├── afile2
│   ├── afile3
│   └── afile4.txt
├── afile1
├── afile2
├── afile3
├── foo.test

Это было решение, которое работало для этого сценария (который, я считаю, является более общим случаем).

 $ find . -type f -not -path '*/\.*' -exec zip -r test.zip {} +

пример

$ find . -type f -not -path '*/\.*' -exec zip -r test.zip {} +
updating: adir1/afile1 (stored 0%)
updating: adir1/afile1.zip (stored 0%)
updating: adir1/afile2 (stored 0%)
updating: adir1/afile3 (stored 0%)
updating: adir1/afile4.txt (stored 0%)
updating: adir2/afile1 (stored 0%)
updating: adir2/afile2 (stored 0%)
updating: adir2/afile3 (stored 0%)
updating: adir2/afile4.txt (stored 0%)
updating: adir3/afile1 (stored 0%)
updating: adir3/afile2 (stored 0%)
updating: adir3/afile3 (stored 0%)
updating: adir3/afile4.txt (stored 0%)
updating: afile1 (stored 0%)
updating: afile2 (stored 0%)
updating: afile3 (stored 0%)
updating: foo.test (deflated 87%)
1

Если вы предпочитаете более сложные возможности фильтрации , найдите хороший инструмент для поиска :

find mydir/ -! -name ".hello" -print | zip mydir -@

Веселитесь с «найти».

1

Вы можете использовать шаблоны оболочки для исключения совпадений, все написано в zip руководстве (с примерами)

0

Попробуй это...

zip -r mydir.zip mydir/ -x .*.*
0

Короче, и использует в своих интересах особенности globbing:

zip -r mydir.zip mydir/*

(файлы не включены в подстановочный знак *)

Обратите внимание, что каталог «mydir /» может быть не включен в пути к файлам в результирующем zip-файле, поэтому это немного изменит вывод. Возможно, вам придется изменить процесс извлечения в результате.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .