我习惯性地认为mv directory1 directory2/
,如果我输入错误的名称,directory2
它就会失败并警告我目录不存在。事实证明,事实并非如此。
有没有简单的方法可以实现这一点?(目标目录不存在时会失败)。
答案1
mv -t directory2/ directory1
从man 1 mv
:
mv [OPTION]... -t DIRECTORY SOURCE...
-t
,--target-directory=DIRECTORY
将所有SOURCE
参数移至DIRECTORY
不过 POSIX 并不要求此选项。您mv
可能支持也可能不支持它。
例子:
$ ls
$ # Nothing here so far
$ mkdir foo bar
$ # Let's move foo to bar/
$ mv -t baz/ foo # Oops, a typo, with -t
mv: failed to access 'baz/': No such file or directory
$ mv foo baz/ # Oops, a typo, without -t
$ ls
bar baz
$
答案2
如果您正在使用bash
,并且您的mv
命令不支持非 POSIX-t
选项,您仍然可以mvdir
在.bashrc
文件中定义一个函数,如下所示:
mvdir() {
if [ -d "$2" ]
then
mv "$1" "$2"
else
printf 'mvdir: "%s" does not exist, or is not a directory\n' "$2" >&2
return 1
fi
}
有了这个函数定义,你就可以这样说:
mvdir directory1 directory2
以更紧凑的形式来说,该函数的核心命令是:
( [ -d directory2 ] && mv directory1 directory2 )
该逻辑在函数中略微扩展,以便在 directory2 不存在或不是目录的情况下更清楚地显示错误消息。如果目标目录确实存在,mv
则将执行,并且将由 引发任何错误消息或结果代码mv
。如果目录不存在,printf
则将写入诊断,stderr
并且该函数返回非零结果代码以指示错误。
为了测试,请从一个空目录开始:
$ find *
find: *: No such file or directory
$ mkdir A
$ find *
A
$ mvdir A B || echo fail
mvdir: "B" does not exist, or is not a directory
fail
$ mkdir B
$ find *
A
B
$ mvdir A B || echo fail
$ find *
B
B/A