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