复制子目录中的所有文件并重命名而不是覆盖

5 linux cp find

我在另一个目录的子目录中有许多图像,我想将它们复制到一个目录中,以便所有图像都在一个地方。

经过一番搜索,我找到并修改了一些东西来创建这个命令:

find . -name "z*.jpg" -exec cp '{}' ~/Extracted/ \;
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但是我发现具有相同名称的图像会被覆盖,所以我这样做了:

find . -name "z*.jpg" -exec cp -n '{}' ~/Extracted/ \;
Run Code Online (Sandbox Code Playgroud)

但是现在具有相同名称的图像被简单地忽略了。

无论如何我可以这样做,以便复制每个图像并重命名具有相同名称的图像?

Dav*_*ter 8

GNUcp(1)有一个备份选项:

cp --backup SOURCE [SOURCE...] [DESTINATION]
Run Code Online (Sandbox Code Playgroud)

这具有以下效果,可以使用手册页中所述的其他选项进行控制cp(1)

--backup[=CONTROL]
          make a backup of each existing destination file

-b     like --backup but does not accept an argument

-S, --suffix=SUFFIX
          override the usual backup suffix
Run Code Online (Sandbox Code Playgroud)

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

  • none, off: 从不进行备份(即使--backup给出)
  • numbered, t: 进行编号备份
  • existing, nil: 编号如果存在编号的备份,否则简单
  • simple, never: 总是做简单的备份

例子

cp --backup=existing --suffix=.orig ~/Music/* ~/Videos
Run Code Online (Sandbox Code Playgroud)

这会将所有文件复制~/Music~/Videos. 如果目标中存在同名文件,则通过附加.orig到其名称作为备份来重命名。如果存在与备份同名的文件.1,则会通过追加重命名备份,如果也存在,.2依此类推。只有这样才能将源文件复制到目的地。

如果要递归复制子目录中的文件,请使用-R

cp -R --backup=existing --suffix=.orig ~/Music ~/Videos
Run Code Online (Sandbox Code Playgroud)