抱歉,如果我错过了cp
手册中的某些内容,但是有没有办法将文件复制到可能存在同名文件的目录中?例如,如果目标目录上存在同名文件,则在复制文件的名称中添加后缀。就像是:
ls foo
file
cp file foo/
ls foo
file
file*
我运行的操作系统是 Ubuntu Gnu/Linux。
答案1
如果名称已被占用,则向目标名称添加一个正整数,并增加该整数直到找到可用名称:
mycp () {
local source="$1"
local target="$2"
local n
# If the target pathname is a directory, add the source filename
# the end of it.
if [ -d "$target" ]; then
target+="/$(basename "$source")"
fi
# Increment n until a free name is found
# (this may leave n unset if the source filename is free).
while [ -e "$target$n" ]; do
n=$(( n + 1 ))
done
cp "$source" "$target$n"
}
注意:除了源路径名和目标路径名之外,该函数不接受任何其他参数。它还假设您正在使用bash
shell。
要“安装”它,只需在 shell 中运行上述代码,或者将其添加到您通常添加别名和函数的位置。
测试:
$ ls
dir file
$ ls dir/
$ mycp file dir
$ ls dir/
file
$ mycp file dir
$ ls dir/
file file1
$ mycp file dir
$ ls dir/
file file1 file2
答案2
您可以推出自己的功能。这将不断添加下划线,直到没有重复:
mycp() {
if [[ -f "$2" ]]; then
mycp "$1" "${2}_"
else
cp "$1" "$2"
fi
}
与传递参数不兼容(例如cp -p
)。更好的选择是使用cp -n
,它不会覆盖现有文件。