У меня есть имя каталога foo
расположенный в ~/Desktop
. Предположим, что я хочу создать каталог из терминала с тем же именем и в том же месте. Когда я попробовал mkdir
это дало ошибку:
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
Это, имеет смысл, но я хочу заменить foo
если существует. Я просмотрел man mkdir
но нет никакой опции, которые делают это.
Таким образом, как перезаписать foo
каталог?
Почему не делает mkdir
имеет опция, чтобы сделать это?
Если Ваша цель состоит в том, чтобы выполнить короткую команду что:
~/Desktop/foo
если это уже существует.~/Desktop/foo
если это уже не существует.Затем можно использовать:
rm -r ~/Desktop/foo; mkdir ~/Desktop/foo
;
эквивалентно новой строке, но она позволяет Вам выполнить несколько команд на одной строке (т.е. как "единственная команда").
-f
флаг для удаления их, не предлагая пользователю в интерактивном режиме. Это хорошо, но я действительно рекомендую быть особенно осторожным с rm -rf ...
. Посмотрите man rm
для деталей.rm
управляйте для окончания перед mkdir
команда выполняется; это - причина использовать ;
вместо &
. (Предыдущая команда &
выполнения асинхронно в фоновом режиме.)mkdir
управляйте для выполнения когда rm
команда успешно выполняется; это - причина использовать ;
вместо ||
.mkdir
управляйте для выполнения когда rm
управляйте сбоями (обычно, отказ будет означать, что каталог уже не существовал); это - причина использовать ;
вместо &&
.rm
команда могла бы перестать работать, даже когда каталог уже существовал, в этом случае mkdir
команда перестанет работать также, но сообщения об ошибках будут иметь смысл и нет, вероятно, никакой потребности добавить среднюю проверку шага foo
существование прежде, чем попытаться создать его.См. 3.2.3 Списка Команд в Справочнике Bash для получения дополнительной информации и объяснения о ;
, &
, ||
, и &&
операторы.
Как muru предложенный (и разработанный Rinzwind), я действительно рекомендую изучить rsync
видеть, удовлетворит ли это Ваши резервные потребности. Существуют некоторые дополнительные полезные руководства на rsync странице документации, а также эта Ubuntu rsync руководство.
то, почему mkdir не делает, имеет эту опцию?
mkdir
создает каталоги ("знак" обозначает, "делают"). Для него также для рекурсивного удаления каталогов и всех файлов в них было бы плохо, потому что это нарушит принцип наименьшего количества удивления способом, которое, вероятно, привело бы к потере данных.
rmdir
даже не удаляет каталоги, которые имеют любой (некаталог) файлы в них. rm
имеет -r
опция, которая имеет смысл с тех пор rm
как ожидают, удалит файлы (который является его целью, таким образом свойственная опасность интуитивна, и пользователи обычно знают, чтобы быть осторожными при выполнении rm
команды).
Нет, нет никакой единственной команды, чтобы сделать то, что Вы спрашиваете.
, Почему?
Это - философия Unix: Запишите программы, которые делают одну вещь и делают это хорошо. Запишите программы для сотрудничества. <глоток> 1 глоток>
В этом экземпляре, mkdir
и rm
команды делают то, чего Вы требуете и работаете хорошо вместе, с тех пор rm -r
удалит каталог также, таким образом, последующее mkdir
создаст каталог.
<глоток> 1 глоток> Искусство Программирования Unix, Eric S. Raymond, самого заключая Doug McIlroy в кавычки.
Команда для удаления каталога rm
. Таким образом, Вам нужны 2 команды.
rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/
Как показано в комментариях можно объединить их в цепочку с ;
(=, делают обоих, даже если 1-е сбои) или &&
(= только mkdir, когда комната не перестала работать).
Эти -r
для удаления директоров, 1-я команда также удаляет ВСЕ содержание каталога. Если это не Ваше намерение и комната и mkdir, не то, что Вы ищете: полномочия chmod
и chown
.
то, почему mkdir не делает, имеет эту опцию?
Неоднозначность. mkdir
средства делают каталог. Не удаляют и делают каталог. И начиная с эти rm
команда для удаления материала нет никакой потребности в rmdir
, чтобы быть в состоянии удалить каталог.
Чтобы сделать это самым чистым способом, я использую это:
create_clean_directory(){
dir_name=$1
if [ -d "$dir_name" ]; then
echo "Removing $dir_name"
rm -rf "$dir_name"
elif [ -f "$dir_name" ]; then
echo "File with this name already exists, not a directory."
exit
fi
if mkdir "$dir_name"; then
echo "Clean directory created: $dir_name"
return 0
else
echo "Creating directory failed: $dir_name"
return 1
fi
}
И использовать его:
create_clean_directory <dir_name>
Это удостоверяется, что то, что Вы пытаетесь удалить, является каталогом и не файлом:
-d
Проверка, если каталог с тем именем уже существует. если так, удалите его.
-f
Проверка, что никакой файл с этим именем не существует. если так, сообщение об ошибке печати и выход.
Создают новый каталог и успех эха, или, если отказавший, отказавшее эхо.