Существует ли простой способ сгенерировать ошибку при перемещении каталога в другой каталог, если целевой каталог не существует?

Существует ли простой способ сгенерировать ошибку при перемещении каталога в другой каталог, если целевой каталог не существует?

У меня была привычка использовать, 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

Связанный контент