Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何将多个目录展平并覆盖到一个目录中?_Linux_Bash_Shell_Unix_Directory - Fatal编程技术网

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