我将如何将多个目录展平并覆盖到一个目录中



我想获取目录层次结构的列表并将它们扁平化为一个目录。 列表中后面的任何重复文件都将替换较早的文件。 例如。。。

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它们。

如果您不介意条目的最终顺序,我想这可以完成这项工作:

#!/bin/bash
declare -A directory;
while read line; do
    directory["${line#*/}"]=${line%%/*}
done < $1
for entry in ${!directory[@]}; do
    printf "%st# 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

相关内容

  • 没有找到相关文章

最新更新