如何将目录的所有内容(不包括父目录)移动到另一个目录 Groovy [重复]

Posted

技术标签:

【中文标题】如何将目录的所有内容(不包括父目录)移动到另一个目录 Groovy [重复]【英文标题】:How to move all contents of Directory (not including Parent) to another directory Groovy [duplicate] 【发布时间】:2017-12-12 22:26:35 【问题描述】:

我有一个 groovy 脚本,它需要 2 个 zip 文件,解压缩它们,然后处理它们。

我遇到的问题是当我解压缩 zip 文件时,每个解压缩的文件都会生成一个子文件夹,然后是解压缩文件的内容而不是内容本身。

例子:

目前,当我解压缩时会发生这种情况

content-1232.zip -> /content-1232/content/<all content here>

我想要的是

content-1232.zip -> /content-1232/<all_content>

放入新目录

content-1232.zip -> /new_directory/<all_content>

我试过了,但没有用:

Path basePath = Paths.get(output.getAbsolutePath())
Path srcPath = Paths.get(pdfContent.getAbsolutePath())
Path targetPath = basePath

Files.move(srcPath, targetPath.resolve(basePath.relativize(srcPath)))

似乎是一件非常简单的事情,但我没有任何运气。我怎样才能在 groovy 中做到这一点?任何帮助将不胜感激

编辑:

static void main(String[] args) 
    logger.info("Beginning unpacking of content...")


    def output = new File("/Users/Haddad/Desktop/workspace/c")
    def pdfContent = new File("/Users/Haddad/Desktop/workspace/c/pdf-content")


    // Look for test1 and test2 production content zip file, ensure there's only 1 and unzip
    List appZip = FileUtil.discoverFiles(output, true, "test1-production-content-.*\\.zip")
    List compliZip = FileUtil.discoverFiles(output,true,"test2-production-content-.*\\.zip")

    assert appZip.size() == 1, "Did not find expected number of test1 content zip, actual size is: " + appZip.size()
    assert compliZip.size() == 1, "Did not find expected number of test2 content zip, actual size is " + appZip.size()

    def outputAppZip = new File(output.getAbsolutePath()+"/"+appZip.get(0).getName()+"-intermediate");
    def outputCompliZip = new File(output.getAbsolutePath()+"/"+compliZip.get(0).getName()+"-intermediate");

    ZipUtil.unzipToDisk(appZip.get(0), outputAppZip )
    ZipUtil.unzipToDisk(compliZip.get(0), outputCompliZip )


    // move it to pdf content
    List applicationContent = FileUtil.discoverDirectories(output, "one-production-content-.*-intermediate", true)
    assert applicationContent.size() == 1, "Did not find expected number of test1 contents " + applicationContent.size()

    def success = FileUtil.copy(applicationContent.get(0), pdfContent)
    assert success, "Could not copy tt content"

    // move pdf content
    List complianceContent = FileUtil.discoverDirectories(output, "two-production-content-.*-intermediate", true)
    assert complianceContent.size() == 1, "Did not find expected number of test2 contents " + complianceContent.size()
    success = FileUtil.copy(complianceContent.get(0), pdfContent)
    assert success, "Could not copy pdf content"

    // rename to not be unsupported
    List unsupportedDirs = FileUtil.discoverDirectories(pdfContent, "_unsupported_.*", true)
    for (File file : unsupportedDirs) 
        file.renameTo(new File(file.getParentFile(), file.getName().replace("_unsupported_", "")))
    


    logger.info("Completed!")

【问题讨论】:

显示你的解压码。 与 Java 或 grails 无关。标签已移除 @AbhijitSarkar 刚刚添加了代码。我希望这不会给我的问题增加任何不必要的复杂性 grails 标签完全具有误导性 - 再次被删除。在这个问题中没有一点 grails 特定的代码。 @mosawi 这不是它的工作原理。我们不是因为回答您向我们提出的随机问题而获得报酬的顾问。我们是喜欢解决问题的程序员。为了做到这一点,我们需要先了解上下文。如果您想处理模糊的信息,请询问您的上级。 【参考方案1】:

这个怎么样?

输入

test.zip
--- test
------ test.txt

输出

<someFolder>
--- test.txt

代码

public class Main 

    public static void main(String[] args) throws IOException 
        Main main = new Main();

        Path input = main.getInputPath(args);
        Path output = main.getOutputPath(args);

        main.extract(input, output);
        main.flatten(output);
    

    private final Path getInputPath(String[] args) 
        if (args.length < 1) 
            throw new IllegalArgumentException("Usage: Main <inputFile> [<outputDirectory>]");
        

        Path input = Paths.get(args[0]);

        if (!isRegularFile(input)) 
            throw new IllegalArgumentException(String.format("%s is not a file.", input.toFile().getAbsolutePath()));
        

        return input;
    

    private final Path getOutputPath(String[] args) throws IOException 
        return args.length < 2 ? Files.createTempDirectory(null) :
                Files.createDirectories(Paths.get(args[1]));
    

    private final void extract(Path input, Path output) throws IOException 
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(input.toFile()))) 
            for (ZipEntry ze = zis.getNextEntry(); ze != null; ze = zis.getNextEntry()) 
                String fileName = ze.getName();

                if (fileName.contains("__MACOSX")) 
                    continue;
                

                File file = new File(output.toFile(), fileName);

                if (ze.isDirectory()) 
                    Files.createDirectories(file.toPath());
                    continue;
                

                System.out.println("Extracting: " + file.getAbsolutePath());

                try (FileOutputStream fos = new FileOutputStream(file, true)) 
                    byte[] buffer = new byte[4096];
                    for (int len = zis.read(buffer); len > 0; len = zis.read(buffer)) 
                        fos.write(buffer, 0, len);
                    
                
            
        
    

    private final void flatten(Path output) throws IOException 
        List<Path> children = Files.list(output)
                .collect(toList());

        if (children.size() == 1) 
            Path path = children.get(0);
            Files.list(path)
                    .forEach(f -> 
                        try 
                            System.out.printf("Moving %s to %s.\n", f.toFile().getAbsolutePath(),
                                    output.toFile().getAbsolutePath());
                            Files.move(f, Paths.get(output.toFile().getAbsolutePath(), f.toFile().getName()));
                         catch (IOException e) 
                            throw new UncheckedIOException(e);
                        
                    );

            Files.delete(path);
        
    

【讨论】:

随机投反对票,需要解释一下吗? 谢谢@AbhijitSarkar。不确定谁对你的答案或我的问题投了反对票,但这个答案很有效。我希望有一个简单的解决方案,但这看起来比我所拥有的要好得多 关于第一行的 flatten 方法List&lt;Path&gt; children = Files.list(output).collect(toList()); toList() 在哪里? 我也没有看到isRegularFile 方法?有兴趣看看它如何检查文件类型 toList isRegularfile 这就是 IDE 存在的原因。要求它进行静态导入。

以上是关于如何将目录的所有内容(不包括父目录)移动到另一个目录 Groovy [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java如何拷贝文件到另一个目录下

linux怎么将一个文件移动到另一个目录下

如何使用 JavaScript 将所有 HTML 元素子元素移动到另一个父元素?

如何在PHP中将所有文件和文件夹从一个目录移动到另一个目录?

使用 Python 将所有文件从一个目录移动到另一个目录

linux怎么将一个文件移动到另一个目录下