如果文件存在,请复制其他文件,但不要覆盖

时间:2015-05-21 19:05:06

标签: bash

给出以下代码:

for d in ./Event_*/; do
set -- "$d/"*.mcp
if [ -e "$1" ]; then
    # there is at least one .mcp file in $d
    cp -rp -v -- "$d/KNYN.BHZ" ./newdir/
fi
done

我想要做的是,对于./Event_*/中的每个目录,如果存在文件* .mcp,请将文件KNYN.BHZ复制到新目录。由于所有文件名KNYN.BHZ都相同,如何在不覆盖的情况下复制所有KNYN.BHZ文件?正如我的代码现在所说,如果我运行它,输出只有一个文件KNYN.BHZ。

3 个答案:

答案 0 :(得分:2)

您需要为每个文件指定一个唯一的名称。例如,您可以为目录名称添加后缀(或只是*代表的部分):

for d in ./Event_*/; do
set -- "$d/"*.mcp
if [ -e "$1" ]; then
    cp -rp -v -- "$d/KNYN.BHZ" "./newdir/KNYN.`echo $d | sed 's/[\.\/]//g;s/Event_//:'`.BHZ"
fi
done

因此Event_123/KNYN.BHZ将成为./newdir/KNYN-123.BHZ

或者您可以使用计数器:

i=0;
for d in ./Event_*/; do
set -- "$d/"*.mcp
if [ -e "$1" ]; then
    cp -rp -v -- "$d/KNYN.BHZ" "./newdir/KNYN-$((++i)).BHZ"
fi
done

因此,Event_123/KNYN.BHZ将成为./newdir/KNYN-4.BHZ(或者是mcp的任何人工目录。

后一种解决方案更简单,而前者保留了与原始文件夹的关联(如果你反复这样做,这可能很重要 - 当然你需要不同的文件夹或添加日期:

for d in ./Event_*/; do
set -- "$d/"*.mcp
if [ -e "$1" ]; then
    cp -rp -v -- "$d/KNYN.BHZ" "./newdir/KNYN.`echo $d | sed 's/[\.\/]//g;s/Event_//:'`_`date '+%Y-%m-%d'`.BHZ"
fi
done

产生./newdir/KNYN-123_2015-05-21.BHZ(或将其移至目录以获取./2015-05-21/KNYN-123.BHZ)。

答案 1 :(得分:1)

如果你正在使用GNU CoreUtils cp(非常有可能),那么cp就有--backup个选项。我认为numbered方法也是一个很好的起点。

答案 2 :(得分:0)

您可以使用RANDOM变量。

for d in ./Event_*/; do
set -- "$d/"*.mcp
if [ -e "$1" ]; then
    # there is at least one .mcp file in $d
    cp -rp -v -- "$d/KNYN.BHZ" ./newdir/KNYN_${RANDOM}.BHZ
fi
done