cp 文件到具有同名文件的目录

cp 文件到具有同名文件的目录

抱歉,如果我错过了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"
}

注意:除了源路径名和目标路径名之外,该函数不接受任何其他参数。它还假设您正在使用bashshell。

要“安装”它,只需在 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,它不会覆盖现有文件。

相关内容