Linux 如何将多个目录展平并覆盖到一个目录中?
我想获取一个目录层次结构列表,并将它们展平到一个目录中。列表中后面的任何重复文件都将替换以前的文件。例如Linux 如何将多个目录展平并覆盖到一个目录中?,linux,bash,shell,unix,directory,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/ 我有一个可能
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程序来实现这一点。我对聪明的方法感兴趣,这样用户就可以解决它。最大的障碍是“必要时创建中间目录”,可能是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 "%s\t# from %s/\n" $entry ${directory[$entry]}
done
如果需要移动文件,只需将打印步骤替换为mv
--或cp
--即可,如下所示:
for entry in ${!directory[@]}; do
mv "${directory[$entry]}/$entry" "your_dir_path/$entry"
done
目录的顺序很重要,只有这样才能正确地进行分层。结果的最终顺序无关紧要。我从未见过
declare
,也不知道bash有散列!我认为files.txt是一个查找-键入有问题的目录的f
?我想您可以准确地进行查找-f型
;如果您想直接执行它,您可以通过执行以下操作创建一个临时文件:while。。。;做完成
for entry in ${!directory[@]}; do
mv "${directory[$entry]}/$entry" "your_dir_path/$entry"
done