如何将多个目录展平并叠加到一个目录中?

时间:2012-11-29 00:18:24

标签: linux bash shell unix directory

我想获取目录层次结构列表并将它们展平到一个目录中。列表中稍后的任何重复文件都将替换先前的文件。例如......

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程序来执行此操作。我对SO用户可能解决它的聪明方式感兴趣。最大的障碍是“必要时创建中间目录”,或许可以使用basename和dirname的某种组合。

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

1 个答案:

答案 0 :(得分: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