我可以以一种仅在不存在时才移动的mv file1 file2
方式使用吗?file1
file2
file2
我试过了
yes n | mv -i file1 file2
(这让我们mv
询问 file2 是否应该被覆盖并自动回答“否”),但除了滥用之外,-i
它也没有给我很好的错误代码(如果移动,则始终为 141 而不是 0,如果不移动,则为其他值)
答案1
答案2
mv -n
来自man mv
GNU 系统:
-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...