![我可以使用带有 -b 选项的“cp”命令,但如果备份文件已存在,它会失败吗?](https://linux22.com/image/90518/%E6%88%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%20-b%20%E9%80%89%E9%A1%B9%E7%9A%84%E2%80%9Ccp%E2%80%9D%E5%91%BD%E4%BB%A4%EF%BC%8C%E4%BD%86%E5%A6%82%E6%9E%9C%E5%A4%87%E4%BB%BD%E6%96%87%E4%BB%B6%E5%B7%B2%E5%AD%98%E5%9C%A8%EF%BC%8C%E5%AE%83%E4%BC%9A%E5%A4%B1%E8%B4%A5%E5%90%97%EF%BC%9F.png)
我想用来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~