mv:仅当目标不存在时才移动文件

mv:仅当目标不存在时才移动文件

我可以以一种仅在不存在时才移动的mv file1 file2方式使用吗?file1file2file2

我试过了

yes n | mv -i file1 file2

(这让我们mv询问 file2 是否应该被覆盖并自动回答“否”),但除了滥用之外,-i它也没有给我很好的错误代码(如果移动,则始终为 141 而不是 0,如果不移动,则为其他值)

答案1

mv -vn file1 file2。该命令将执行您想要的操作。-v如果您愿意,可以跳过。

-v使其变得详细 - mv 会告诉您它移动了文件(如果它移动了文件)(很有用,因为文件有可能不会被移动)

-n仅当 file2 不存在时才移动。

但请注意,这不是 POSIX作为托马斯·迪基提到

答案2

mv -n

来自man mvGNU 系统:

-n, --no-clobber
不覆盖现有文件

在 FreeBSD 系统上:

-n不要覆盖现有文件。 (-n 选项会覆盖之前的所有 -f 或 -i 选项。)

答案3

if [ ! -e file2 ] && [ ! -L file2 ]
then
    mv file1 file2
# else echo >&2 there is already a file2 file.
fi

或者:

if ! ls -d file2 > /dev/null 2>&1
then
    mv file1 file2
fi

mv仅当file2不存在时才运行。请注意,它并不保证 afile2不会被覆盖,因为 afile2可能已在测试和 之间创建mv,但请注意,至少当前版本的 GNUmv-i-n提供该保证(尽管竞争条件更窄)因为检查是在mv) 内完成的。

另一方面,它是可移植的,允许您区分不同的情况,并且无论文件类型如何file2(常规、管道,甚至目录)。

答案4

test -e name如果名称存在(无论文件、目录或符号链接如何),您还可以使用which 将返回 true。

例如:

touch file
mkdir dir
ln -s file symlink
test -e file && echo file exists
test -e dir && echo dir exists
test -e symlink && echo symlink exists
test -e file || echo you wont see this echo
test -e doesnotexist || echo doesnotexist does not exist...

相关内容