【问题标题】:Jarring All files in a directory based on extension根据扩展名震动目录中的所有文件
【发布时间】:2018-08-12 17:12:41
【问题描述】:

我正在尝试使用 Java 的 jar 命令来 jar 文件夹中的所有文件,如下所示,

jar -cvf /Abhishek/logs.jar my_directory/logs/*.logs*

我正在使用 Java 来执行此操作。

String cmd[] = {"jar", "-cvf", "/Abhishek/logs.jar", "my_directory/logs/*.logs*"};
pb = Runtime.getRuntime().exec(cmd);

但只有清单存储在 jar 中。

added manifest

当我提取 jar 文件时,我得到了清单文件。 所以我对

有疑问
*log.*

是否允许使用这种类型的语法? 因为它在终端中运行良好。

有人能解释一下吗?

谢谢。

【问题讨论】:

  • 你在哪个操作系统上?
  • linux,我正在 ubuntu 中尝试。

标签: java bash shell jar sh


【解决方案1】:

在 Linux 上,文件通配是由 shell 完成的。因此,当您在终端输入*.log 时,shell 会将其展开到匹配文件列表中。然后将其传递给程序。

如果直接执行程序,则必须自己扩展模式。或者你可以让shell使用类似于

的命令来执行它
String cmd[] = {"sh", "-c", "jar -cvf /Abhishek/logs.jar my_directory/logs/*.logs*"};

【讨论】:

    【解决方案2】:

    您可能只想使用 jar 命令使用的 java.util.jar package 中的相同类。这将避免第二个 Java 进程并避免依赖 shell 扩展:

    try (JarOutputStream jar = new JarOutputStream(
            new BufferedOutputStream(
                Files.newOutputStream(
                    Paths.get("/Abhishek/logs.jar"))));
        DirectoryStream<Path> dir = Files.newDirectoryStream(
            Paths.get("my_directory/logs"), "*.logs*")) {
    
        for (Path file : dir) {
            BasicFileAttributes attr =
                Files.readAttributes(file, BasicFileAttributes.class);
    
            String name = file.toString();
            if (attr.isDirectory()) {
                name = name + "/";
            }
    
            JarEntry entry = new JarEntry(name);
            entry.setLastModifiedTime(attr.lastModifiedTime());
            entry.setLastAccessTime(attr.lastAccessTime());
            entry.setCreationTime(attr.creationTime());
            entry.setSize(attr.size());
    
            jar.putNextEntry(entry);
            Files.copy(file, jar);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2013-01-30
      • 2012-02-24
      • 2016-01-05
      相关资源
      最近更新 更多