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

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

4

1 回答 1

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
于 2012-12-16T11:58:57.600 回答