![选项 1:不同的文件管理器](https://linux22.com/image/863788/%E9%80%89%E9%A1%B9%201%EF%BC%9A%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86%E5%99%A8.png)
在 Windows 操作系统上,当您将文件复制到已经具有同名文件的目录中时,它会询问您是否要:
- 复制文件并替换/覆盖现有文件
- 取消将新文件复制到目录中
- 复制文件,但重命名(例如“filename - copy (1)”)
当我在 Ubuntu 中执行此操作时,我没有第三个选项(很多时候这是一个非常有用的选项)。有什么方法可以在 Ubuntu 中做到这一点吗?
答案1
不幸的是 Nautilus 没有这个选项。
选项 1:不同的文件管理器
您可以尝试其他文件管理器,例如海豚。
(需要宇宙資料庫)
选项 2:命令行
您也可以使用命令行程序cp(1)
使用备份选项:
cp --backup -t DESTINATION SOURCE [SOURCE...]
这具有以下效果,可以通过手册页中描述的其他选项进行控制cp(1)
:
--backup[=CONTROL]
― 备份每个现有的目标文件
-b
― 喜欢--backup
但不接受论点
-S
,--suffix=SUFFIX
― 覆盖通常的备份后缀备份后缀为
~
,除非使用--suffix
或进行设置SIMPLE_BACKUP_SUFFIX
。版本控制方法可以通过选项--backup
或VERSION_CONTROL
环境变量进行选择。以下是值:
none
,off
:从不进行备份(即使--backup
给出了)numbered
,t
:进行编号备份existing
,nil
:如果存在编号备份,则使用编号,否则使用简单simple
,never
:始终进行简单备份
例子
cp --backup=existing --suffix=.orig -t ~/Videos ~/Music/*
这会将所有文件复制到~/Music
。~/Videos
如果目标中存在同名文件,则通过.orig
在其名称后附加 来重命名该文件作为备份。如果存在与备份同名的文件,则通过附加 来重命名备份(.1
如果备份也存在)等等.2
。只有这样,源文件才会复制到目标。
如果要递归复制子目录中的文件,请使用:
cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music
答案2
#!/bin/bash
cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"
同名文件将被重命名为在名称中添加了 md5sum 的文件。如果您将其保存为“saveCopy”之类的文件名,则可以find
像这样执行它:
find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;
有关更多信息,请参阅链接。
答案3
之前这个论坛上有针对这个问题的解决方案(ultracopier):参见https://ubuntuforums.org/showthread.php?t=2251859根据该讨论,它可以集成到 Nautilus 中。
答案4
将此脚本复制到顶级目录,使其可执行并运行它:
#!/bin/bash
## Get a list of all files
list=$(find . -mindepth 2 -type f -print)
nr=1
## Move all files that are unique
find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
mv -n $file ./
done
list=$(find . -mindepth 2 -type f -print)
## Checking which files need to be renamed
while [[ $list != '' ]] ; do
##Remaming the un-moved files to unique names and move the renamed files
find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
current_file=$(basename $file)
mv -n $file "./${nr}${current_file}"
done
## Incrementing counter to prefix to file name
nr=$((nr+1))
list=$(find . -mindepth 2 -type f -print)
done