路径名后的组文件

时间:2014-11-21 15:33:37

标签: java shell

我正在尝试编写一个执行以下操作的jave代码,但atm不知道如何实现这一点:

让我们说:我在本地系统上有7个不同或相同路径的文件,我希望在shell命令中使用尽可能少的路径名复制到其他地方

correctfiles是我想要的文件,有些文件我不关心

例如我不想要:

copy C:\tmp\folder1\subfolder12\correctfile3 && copy C:\tmp\folder1\subfolder12\correctfile4

我希望尽可能使用Uberfolder:

copy C:\tmp\folder1\subfolder12\ 

并要求副本C:\ tmp \ folder1 \ subfolder12中没有somefile 因为我不想转移某些文件

e.g。

C:\ tmp \ folder1:somefile1,somefile2

C:\ tmp \ folder1 \ subfolder11:correctfile1,correctfile2

C:\ tmp \ folder1 \ subfolder12:correctfile3,correctfile4

C:\ tmp \ folder2 \ subfolder21:correctfile5

C:\ tmp \ folder2 \ subfolder22:correctfile6,correctfile7

所以在这个例子中我可以使用

copy C:\tmp\folder2

因为该文件夹中的alle文件是正确的文件

而对于其他人我将不得不

 copy C:\tmp\folder1\subfolder11
 copy C:\tmp\folder1\subfolder12

因为Uberfolder C:\ tmp \ folder1中有一些我不想传输的文件

我怎么能实现这个目标? 一个java类,它根据路径名对文件进行分组,使用尽可能少的路径名

1 个答案:

答案 0 :(得分:0)

这实际上非常简单。从List<File> filesToCopy创建

Map<String,Set<String>> dir2names = new HashMap<>();
for( File f: filesToCopy ){
    String name = f.getName();
    // test name for null and do error handling
    String dir = f.getParent();
    // dir for null and do error handling
    Set<String> names = dir2names.get( dir );
    if( names == null ){
        names = new HashSet<>();
        dir2names.put( dir, names );
    }
    names.add( name );
}

将目录部分映射到文件名。迭代这张地图的键

for( String dirname: dir2names.keySet() ){
    File[] entries = new File( dirname ).listFiles();
    if( entries.length > dir2names.get( dirname ).size() ){
        // add list created from dirname + set of names to files to copy
        for( String name: dir2names.get( dirname ){
            String pathname = new File( dirname, name ).getAbsolutePath();
            // add pathname to files to copy
        }
    } else {
        // add directory identified by dirname to files to copy
    }
}

我认为值得递归地做这件事。