我可以使用带有 -b 选项的“cp”命令,但如果备份文件已存在,它会失败吗?

我可以使用带有 -b 选项的“cp”命令,但如果备份文件已存在,它会失败吗?

我想用来cp -b将文件复制到目标,可能会创建目标路径的备份文件(如果它已经存在)。但是,如果备份文件已经存在,我希望cp因错误而失败。

我知道我可以用它-n来避免破坏目标文件,但我想拒绝破坏备份文件。

有没有办法做到这一点?我碰巧cp在 Linux 上使用 GNU,如果没有可用的 POSIX 选项,我愿意接受特定于 Linux 的答案。

答案1

如果您想避免使用 GNU 破坏任何备份文件cp,可以使用编号备份:

cp --backup=t  source destination

这不会覆盖备份,而是会创建额外的备份。

例子

作为示例,让我们考虑一个包含两个文件的目录:

$ ls
file1  file2

现在,让我们将 file1 复制到 file2 上:

$ cp --backup=t file1 file2
$ ls
file1  file2  file2.~1~

正如我们所看到的,备份已完成。

我们再复制一下:

$ cp --backup=t file1 file2
$ ls
file1  file2  file2.~1~  file2.~2~

又进行了一次备份。

文档

man cp“描述”部分末尾之前,--backup列出了各种可能的选项:

备份后缀为“~”,除非使用 --suffix 或 SIMPLE_BACKUP_SUFFIX 设置。版本控制方法可以通过 --backup 选项或通过 VERSION_CONTROL 环境变量来选择。以下是值:

none, off
     从不进行备份(即使给出了 --backup)

编号,t
     进行编号备份

现有,
     如果编号备份存在,则编号为零,否则简单

简单,永远不要
     做简单的备份

作为一种特殊情况,当给出强制和备份选项并且 SOURCE 和 DEST 与现有常规文件的名称相同时,cp 会备份 SOURCE。

答案2

如果你总是用它来复制一个文件,你可以创建一个 shell 函数,可能是你~/.bashrc喜欢的

cpb () 
{ 
    if [ -r "${2}/${1}~" ] ; then 
        echo "backup of '$1' exists in '$2'"
    else 
        cp -b "$1" "$2"
    fi
}

并像这样使用它:

$ mkdir dir
$ cpb x dir
$ cpb x dir
$ cpb x dir
backup of 'x' exists in 'dir'
$ ls -l dir
insgesamt 0
-rw-r--r-- 1 ott ott 0 Jul 16 01:09 x
-rw-r--r-- 1 ott ott 0 Jul 16 01:08 x~

相关内容