脚本bash递归合并目录,并为公共文件执行函数

脚本bash递归合并目录,并为公共文件执行函数,bash,Bash,我需要用bash脚本将几个目录递归地合并到一个目录中,但是当复制一个已经存在的文件时,我希望执行一个特定的函数。 首先,我在想: mkdir merge cp -r dir1/* dir2/* merge/ 但是当一个同名文件已经存在时,我不想覆盖或放弃,我想执行我的函数,比如: if [-f $file] do myfunction() done 你知道我的剧本应该是什么样子吗? 谢谢您可以使用这样一个简单的脚本: #!/usr/bin/env bash

我需要用bash脚本将几个目录递归地合并到一个目录中,但是当复制一个已经存在的文件时,我希望执行一个特定的函数。 首先,我在想:

    mkdir merge
    cp -r dir1/* dir2/* merge/
但是当一个同名文件已经存在时,我不想覆盖或放弃,我想执行我的函数,比如:

    if [-f $file]
    do myfunction() done
你知道我的剧本应该是什么样子吗?
谢谢

您可以使用这样一个简单的脚本:

#!/usr/bin/env bash

myfunction()
{
    printf "Omit %s\n" "$i"
}

dst=merge
mkdir -p "$dst"

# put a list of directories you want to copy here
for i in dir{1..10}
do
    if [ -e "$dst"/"$i" ]
    then
    myfunction "$i"
    continue
    fi

    cp -r "$i" "$dst"
done
它应该适用于简单的情况,但可以进行优化。对于 例如,可以创建一个 应复制并仅运行一次或多次的目录列表
使用
xargs
以避免
参数列表过长的问题。

您可以使用以下脚本:

#!/usr/bin/env bash

# make destination directory
dest=merge
mkdir -p $dest

# If file exists in target directory call `some_function`
# Do not overwrite existing files
for f in dir{1,2,3}/*; do
    [ -f "$dest/$(basename $f)" ] && some_function
    cp -rn "$f" "$dest"
done