2012-11-29 37 views
2

我想获取一个目录层次结构列表并将它们平铺到一个目录中。列表中稍后的任何重复文件将替换较早的文件。例如...我将如何将多个目录压平并叠加到一个目录中?

foo/This/That.pm 
bar/This/That.pm 
bar/Some/Module.pm 
wiff/This/That.pm 
wiff/A/Thing/Here.pm 

这将风与

This/That.pm  # from wiff/ 
Some/Module.pm # from bar/ 
A/Thing/Here.pm # from wiff/ 

我有可能在复杂的Perl程序来做到这一点。我对用户可能解决它的聪明方式感兴趣。大的障碍是“根据需要创建中间目录”,可能包含基本名称和目录名称的组合。

我正在解决的真正问题是检查两个安装的Perl库之间的差异。我首先将每个Perl的多个库目录展平成一个目录,模拟Perl将如何搜索一个模块。我可以再diff -r他们。

回答

1

如果你不介意的条目的最后命令,我想这可以做的工作:

#!/bin/bash 

declare -A directory; 

while read line; do 
    directory["${line#*/}"]=${line%%/*} 
done < $1 

for entry in ${!directory[@]}; do 
    printf "%s\t# from %s/\n" $entry ${directory[$entry]} 
done 

输出:

$ ./script.sh files.txt 
A/Thing/Here.pm # from wiff/ 
This/That.pm # from wiff/ 
Some/Module.pm # from bar/ 

如果你需要移动的文件,然后你可以简单地替换为mv的印刷步骤 - 或cp - ,就像这样:

for entry in ${!directory[@]}; do 
    mv "${directory[$entry]}/$entry" "your_dir_path/$entry" 
done 
+0

的奥德目录环只有重要,才能正确分层。结果的最终顺序无关紧要。我从来没有见过'声明'并且不知道bash有哈希值!我认为files.txt是一个'find。有问题的目录的类型f? – Schwern

+0

我想你可以做一个'find。型f';如果你想直接执行它,你可以通过下面的方式创建一个临时文件:'while ...;做...;完成<(find。-type f)' – Rubens

相关问题