将目录移动到另一个目录时,当目标目录不存在时,是否有一种简单的方法可以产生失败?

将目录移动到另一个目录时,当目标目录不存在时,是否有一种简单的方法可以产生失败?

我习惯性地认为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

相关内容