如何在unix中压缩整个文件夹树,但只能压缩某些文件?

wil*_*fun 43 unix zip

我一直被困在一个小的unix命令行问题上.

我有一个网站文件夹(4gb)我需要获取一份副本,但只有.php,.html,.js和.css文件(只有几百kb).

理想情况下,有一种方法可以压缩或tar整个文件夹,但只能抓取某些文件扩展名,同时保留子文件夹结构.这是可能的,如果是的话,怎么样?

我确实尝试做一个完整的拉链,然后通过并排除某些文件,但它似乎有点过分.

我是unix的新手.

任何想法将不胜感激.

Cur*_*ker 67

切换到网站文件夹,然后运行

zip -R foo '*.php' '*.html' '*.js' '*.css' 
Run Code Online (Sandbox Code Playgroud)

您也可以从网站文件夹外部运行:

zip -r foo website_folder -i '*.php' '*.html' '*.js' '*.css'
Run Code Online (Sandbox Code Playgroud)

  • 绝对在模式周围放置单引号以匹配,否则shell将在执行`zip`之前扩展它们,并且您将最终得到当前目录中的匹配文件. (4认同)
  • 根据zip手册页,你必须用单引号引用参数...否则,我怀疑shell会在传递给zip之前将它们全局化 (2认同)

Nic*_*ick 21

您可以使用findgrep生成文件列表,然后将其输入zip

例如

find . | egrep "\.(html|css|js|php)$" | zip -@ test.zip
Run Code Online (Sandbox Code Playgroud)

(-@告诉zip从stdin读取文件列表)

  • 如果您有大量不匹配的文件,那么执行诸如`find之类的操作会稍微高效一些.-iname\*.html -o -iname\*.css -o -iname\*.js -o -iname\*.php`而不是`find.| grep ......` (4认同)

Mit*_*aro 7

这就是我设法做到的,但我也喜欢ghostdog74的版本.

tar -czvf archive.tgz `find  test/ | egrep ".*\.html|.*\.php"`
Run Code Online (Sandbox Code Playgroud)

您可以通过将其添加到正则表达式来添加额外的扩展.