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