我想获取目录层次结构列表并将它们展平到一个目录中。列表中稍后的任何重复文件都将替换先前的文件。例如......
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
他们。
答案 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