как мне заархивировать все дерево папок в unix, но только определенные файлы?

Я застрял в небольшой проблеме с командной строкой unix.

У меня есть папка веб-сайта (4 ГБ), копию которой мне нужно получить, но только файлы .php, .html, .js и .css (это всего пара сотен килобайт).

В идеале я думаю, что есть способ заархивировать или заархивировать всю папку, но только с определенными расширениями файлов, сохраняя при этом структуру подпапок. Возможно ли это и если да, то как?

Я пытался сделать весь zip, затем просматривал и исключал определенные файлы, но это казалось немного чрезмерным.

Я новичок в unix.

Любые идеи очень приветствуются.


person willdanceforfun    schedule 10.07.2009    source источник
comment
Вы можете получить лучшие результаты, если спросите об этом на serverfault.com (специальный сайт системного администратора).   -  person Mark Renouf    schedule 11.07.2009


Ответы (6)


Перейдите в папку веб-сайта, затем запустите

zip -R foo '*.php' '*.html' '*.js' '*.css' 

Вы также можете запустить это из-за пределов папки веб-сайта:

zip -r foo website_folder -i '*.php' '*.html' '*.js' '*.css'
person Curtis Tasker    schedule 11.07.2009
comment
Это не найдет соответствующие файлы в подкаталогах. - person Ted Percival; 11.07.2009
comment
на справочной странице zip вы должны заключать аргументы в одинарные кавычки ... в противном случае я подозреваю, что оболочка будет их записывать перед передачей в zip - person kdgregory; 11.07.2009
comment
@Ted: В тесте, который я провел, подкаталоги рекурсивно рекурсивны. - person MitMaro; 11.07.2009
comment
Я запускал man zip на нескольких разновидностях Unix, и все они слегка отличались друг от друга. Вам может понадобиться или не понадобиться одинарные кавычки вокруг каждого из шаблонов, как утверждает kdgregory. - person Curtis Tasker; 11.07.2009
comment
Определенно поместите одинарные кавычки вокруг шаблонов для соответствия, иначе оболочка раскроет их перед выполнением zip, и вы просто получите совпадающие файлы в текущем каталоге. - person Ted Percival; 11.07.2009
comment
Это сработало с кавычками. Без него не пробовал. Огромное спасибо! Кажется, самое простое из всех решений. - person willdanceforfun; 14.07.2009
comment
Я попробовал zip -r foo Website_folder -i 'test*', а также zip -R foo Website_folder -i 'test*'. Это не сработало для меня. -я не нашел файлы в подкаталогах. Ниже ответ от Ника сделал свою работу. - person elToro; 25.02.2014
comment
Обратите внимание на чувствительный к регистру -r. Здесь работала только строчная буква -r. - person Alex2php; 10.12.2015

Вы можете использовать find и grep для создания списка файлов, а затем передать его в zip

e.g.

find . | egrep "\.(html|css|js|php)$" | zip -@ test.zip

(-@ говорит zip прочитать список файлов из стандартного ввода)

person Nick    schedule 11.07.2009
comment
Если у вас есть большое количество несовпадающих файлов, было бы немного эффективнее сделать что-то вроде find . -iname \*.html -o -iname \*.css -o -iname \*.js -o -iname \*.php вместо find . | grep .... - person Adam Rosenfield; 11.07.2009
comment
красивое решение - person ejaenv; 21.01.2020

Вот как мне удалось это сделать, но мне также нравится версия ghostdog74.

tar -czvf archive.tgz `find  test/ | egrep ".*\.html|.*\.php"`

Вы можете добавить дополнительные расширения, добавив их в регулярное выражение.

person MitMaro    schedule 11.07.2009
comment
у вас могут возникнуть проблемы с размером списка аргументов — см. xargs - person kdgregory; 11.07.2009

Мне понравился ответ Ника, но, поскольку это сайт программирования, почему бы не использовать для этого Ant. :)

Затем вы можете указать параметр, чтобы файлы разных типов можно было заархивировать.

http://ant.apache.org/manual/Tasks/zip.html

person James Black    schedule 11.07.2009
comment
Я нашел ant полезным, и документация довольно проста. - person James Black; 14.07.2009

вы можете использовать find (GNU), чтобы найти все ваши файлы php, html и т. Д. Затем заархивируйте их.

find /path -type f \( -iname "*.php" -o -iname "*.css" -o -iname "*.js" -o -iname "*.ext" \) -exec tar -r --file=test.tar "{}" +;

после этого вы можете застегнуть его

person ghostdog74    schedule 11.07.2009
comment
проблема с этим подходом в том, что он будет выполняться для каждого файла - person kdgregory; 11.07.2009
comment
Да. лучший подход - использовать zip -R, как написал один из вас. - person ghostdog74; 11.07.2009

Вы можете написать сценарий оболочки для копирования файлов на основе шаблона/выражения в новую папку, заархивировать содержимое и затем удалить папку. Теперь, что касается его фактического синтаксиса, я оставлю это вам: D.

person barfoon    schedule 10.07.2009
comment
Скопировать 4 ГБ данных? Я думаю, что это должно быть использовано в качестве последнего отчета. - person MitMaro; 11.07.2009
comment
Вы бы не копировали весь каталог — только файлы, соответствующие шаблону. Таким образом, когда вы создаете zip, вы можете просто сказать zip all, а затем удалить. - person barfoon; 11.07.2009
comment
@MitMaro, ОП, говорит, что это всего лишь несколько сотен КиБ ... в любом случае, улучшенную версию можно сделать просто ссылками вместо копирования (если символические ссылки, то используйте -h с tar) ... и таким образом вы могли бы повторно используйте этот вид папки для дальнейших резервных копий :-) - person fortran; 11.07.2009
comment
@fortran: полностью пропустил это. мои извинения barfoon это не такая уж плохая идея. - person MitMaro; 11.07.2009