【问题标题】:How to zip specified folders with Command Line如何使用命令行压缩指定文件夹
【发布时间】:2009-09-11 16:46:48
【问题描述】:

你能告诉我如何将指定的文件压缩到同一个 Zip 文件中。让我告诉我的文件夹是如何填充的:

  • 任务计划程序每天备份我的数据库并将它们保存到文件中。它每天创建 4 个数据库备份,这意味着每天还会有 4 个文件。所以我需要将新创建的备份压缩到同一个 zip 文件中(当然它与前一天的 zip 文件不同,当天会为新创建的备份文件创建 zip 文件),我需要自动执行此操作。好吧,我知道如何让它自动化。我可以使用 Windows 任务计划程序来自动执行任务。

谢谢。

【问题讨论】:

  • 好的...所以,您使用的是 Windows。你想写一个批处理文件吗?电源外壳脚本? C# 程序?

标签: .net windows command-line backup zip


【解决方案1】:

我使用开源程序7Zip,命令行如下:

"C:\Program Files\7-Zip\7z.exe" a My.zip MyFileOrFolder

如果您使用的是 NTFS 分区,让 Windows 自动压缩您的备份文件所在的文件夹也可能会解决您的问题(右键单击您的文件夹,选择属性,高级,然后单击压缩内容以保护数据) .

【讨论】:

  • 不错的答案,但是使用同一个包中的 7za.exe 可能比使用 7z.exe 稍微好一些,因为 7z.exe 使用它安装到的文件夹中的其他文件,而 7za.exe可以独立工作,无需查看 PATH 变量来查找剩余文件
  • @Dmityugov:谢谢,很高兴知道。我经常使用 7z.exe,但我想我的路径设置得当。
  • 我正在使用 7z.exe 并且没有任何问题,即使我没有将它的文件夹添加到我的 PATH 中
  • 其实我没有看到任何7za.exe...也许最新版本消除了这个问题。
【解决方案2】:

您可以使用DotNetZip 来实现它——它最初是作为一个供程序员使用的库而制作的,但是基于该库构建并附带的示例应用程序本身就变得非常有用。

其中一个“示例”称为 zipit.exe - 一个控制台工具。指定一个不存在的 zipfile 来创建一个新的,或者指定一个现有的 zipfile 来更新它。

zipit.exe ZipArchive.zip  c:\data\folder1

您可以指定一个或多个文件名、目录或描述要包含哪些文件的逻辑表达式。对于表达式:

  • name = *.jpg
    任何 .jpg 文件。

  • mtime > 07/01/2009
    最后修改时间在 2009 年 7 月 1 日午夜之后的任何文件。还有 ctime 和 atime 用于创建时间和访问时间。

  • ctime > 07/01/2009:07:53:00
    创建时间在 2009 年 7 月 1 日上午 7:53 之后的任何文件。

  • size > 320mb
    任何大小超过 320mb 的文件。您也可以使用 kbgb。或者省略以字节为单位的大小的字符。您可以使用

  • attr != H
    任何没有设置隐藏属性的文件。其他属性包括 S=system、R=Readonly、A=Archive。当然,您也可以测试该属性是否为 ON(使用 = 而不是 !=)。

  • attr != H and size > 320mb
    包括同时满足这两个条件的文件。您也可以使用 OR 作为连词。使用括号对复杂的表达式进行分组。

  • name = *.jpg or name = *.gif
    包括满足一个或另一个条件的文件。

  • (name = *.jpg) or (name = *.gif)
    同上。

  • (mtime >= 07/01/2009) and (mtime < 07/02/2009)
    7 月 1 日修改的任何文件。从午夜到午夜。

  • (name = *.jpg) AND (mtime >= 07/01/2009) and (mtime < 07/02/2009)
    7 月 1 日修改的任何 .jpg 文件。

  • (name = *.jpg) and (size >= 100kb) and (mtime >= 07/01/2009) and (mtime < 07/02/2009)
    任何 .jpg 文件,大小为 100kb 或更大,于 7 月 1 日修改。

使用 zipit.exe 工具上的其他选项,您还可以:

  • 指定是否要遍历重解析点(如符号链接或连接点,例如“我的音乐”)。
  • 是否递归目录(默认为 NOT)
  • 使用 AES 或“常规” zip 加密对 zip 进行加密
  • 指定分段大小以生成跨区或分段 zip 文件。
  • 生成自解压存档

例子:

zipit.exe Archive.zip -D c:\project1 -r+ "(name = *.xlsx) and (mtime >= 07/01/2009) and (mtime < 07/31/2009)"

  • 生成一个 Archive.zip 文件,其中包含 c:\project1 目录层次结构中的所有 .xslx 文件,这些文件在 7 月进行了修改。

zipit.exe Unpack.exe -sfx w -D project2 -r+ "(name = *.pdf) and (size > 100kb)"

  • 生成一个名为 Unpack.exe 的自解压 GUI exe,其中包含 project2 目录层次结构中大于 100k 的所有 .pdf 文件。

DotNetZip 是免费的。

库的 .NET 界面中也提供所有这些功能。还有一个 GUI 工具。

【讨论】:

    【解决方案3】:

    我放弃了 WinZip,转而使用 7-Zip,因为它快速、免费、高效,并且适用于 Windows 和 Linux。

    如果您是 WinZip 粉丝,请查看 WinZip 命令行支持插件:http://winzip.com/prodpagecl.htm

    您可以在 Windows 命令行允许的范围内归档尽可能多的文件或目录:

    wzzip archive.zip dir1 dir2 dir3 ...
    

    【讨论】:

    • 好吧,其实我既不是 Winzip 也不是 Winrar 的粉丝。我目前正在使用 7-Zip,但我不知道我可以用 7Zip 做这样的事情 :) 谢谢。
    【解决方案4】:

    您可以在http://gnuwin32.sourceforge.net/packages/zip.htm 下载适用于 Windows 的 GNU zip。如果您想获得整个 UNIX 命令行路由,可以使用http://www.cygwin.com/ 提供 zip。

    手册页给出的这个例子似乎可以解决您的问题,还有许多其他命令行选项:

    例如,如果 foo.zip 存在并且包含 foo/file1 和 foo/file2,目录 foo 包含文件 foo/file1 和 foo/file3,那么:

          zip -r foo.zip foo
    

    或者更简洁

          zip -r foo foo
    

    将替换 foo.zip 中的 foo/file1 并将 foo/file3 添加到 foo.zip。在这之后, foo.zip 包含 foo/file1、foo/file2 和 foo/file3,而 foo/file2 从 之前。

    【讨论】:

      【解决方案5】:

      查看一个名为 PKZIP 的旧程序。我相信你也可以用 WinZip 和 7Zip 做到这一点。

      【讨论】:

      • 是的 WinZip - 它有一个“wzcline”插件,用于将 wzzip.exe 和 wzunzip.exe 命令添加到您的命令行。压缩文件夹是wzzip -a -ex -r -p (zipname) (folder name) - 关键是 -r = 递归和 -p = 包含路径信息
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多