使用 gzip 压缩所有具有特定扩展名的文件

使用 gzip 压缩所有具有特定扩展名的文件

我正在尝试对 ubuntu 上所有具有文件扩展名 .css、.html 或 .js 的文件进行 gzip 压缩。这些文件位于顶级目录和所有子目录中。我想保留原始文件并覆盖 .gz 文件(如果已存在)。

因此,当我有 n 个文件时,我想保留这 n 个文件并创建另外 n 个存档文件。不只是一个。

我的尝试是运行如下脚本:

gzip -rkf *.css
gzip -rkf *.html
... one line for each file extension

首先:我需要在该脚本中为要 gzip 的每个文件扩展名添加一行。没问题,但我希望找到更好的方法

第二点也是最重要的一点:它不起作用。虽然 -r 应该可以完成工作,但子目录没有改变。gzip 文件仅在顶级目录中创建。

我在这里遗漏了什么?

顺便说一句:以下是详细输出中的一个错误,对吗?当使用 -k 和 -v 选项时

-k, --keep        keep (don't delete) input files
-v, --verbose     verbose mode

详细输出显示它替换了文件,尽管“替换”意味着替换后原始文件不存在。无论如何,这只是输出内容。

$ ls
  index.html      subdir1  testfile      testfile.css.gz
  javaclass.java  subdir2  testfile.css
$ gzip -fkv *.css
  testfile.css:   6.6% -- replaced with testfile.css.gz
$ ls
  index.html      subdir1  testfile      testfile.css.gz
  javaclass.java  subdir2  testfile.css

答案1

我会用

find /path/to/dir \( -name '*.css' -o -name '*.html' \) -exec gzip --verbose --keep {} \;

如果要匹配不区分大小写的扩展名(即包含和/或扩展名),请更改name为。如果要从当前目录开始递归搜索,可以省略。iname.CSS.HTML/path/to/dir

答案2

您可以使用 for 循环来查找每个文件,然后对其进行压缩:

for i in `find | grep -E "\.css$|\.html$"`; do gzip "$i" ; done

答案3

获取文件列表:

find -type f | grep -P '\.js|\.html|\.css'

并对所有这些文件进行 gzip 压缩:

find -type f | grep -P '\.js|\.html|\.css' | tar cvzf archive.gz -T -

答案4

我用了steeldriver 的回答,但我喜欢用--best--force选项来完成它。

cd进入任意文件夹并输入此代码。所有匹配的文件都将被压缩。

find . \( -name '*.css' -o -name '*.js' \) -exec gzip --verbose --keep --best --force {} \;
  • 使用--best最佳压缩比。
  • 用于--force覆盖而不询问是否已经有 gzip 压缩文件。

相关内容