Перезаписать существующий каталог?
У меня есть имя каталога foo
находится в ~/Desktop
, Предположим, я хочу создать каталог из терминала с тем же именем и в том же месте. Когда я пытался mkdir
это дало ошибку:
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
Это имеет смысл, но я хочу заменить foo
если существует. Я просмотрела man mkdir
но нет никакой возможности сделать это.
Так как переписать foo
каталог?
Почему не mkdir
есть возможность сделать это?
3 ответа
Если ваша цель - выполнить однострочную команду, которая:
- Удаляет и воссоздает каталог
~/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 для получения дополнительной информации и объяснения о ;
, &
, ||
, а также &&
операторы.
Как предложил Муру (и Ринзвинд уточнил), я рекомендую вам изучить rsync
чтобы увидеть, будет ли он соответствовать вашим потребностям в резервном копировании. На странице документации по rsync есть несколько дополнительных полезных руководств, а также это руководство по Ubuntu rsync.
почему у mkdir нет этой опции?
mkdir
создает каталоги ("mk" означает "make"). Для него также рекурсивно удалять каталоги и все файлы в них было бы плохо, потому что это нарушило бы принцип наименьшего удивления таким образом, что, вероятно, привело бы к потере данных.
rmdir
даже не удаляет каталоги, в которых есть (не каталоги) файлы. rm
имеет -r
вариант, который имеет смысл, так как rm
Ожидается, что файлы будут удалены (это является его целью, поэтому внутренняя опасность интуитивно понятна, и пользователи обычно знают, что нужно соблюдать осторожность при запуске rm
команд).
Нет, нет единой команды, чтобы делать то, что вы просите.
Зачем?
Это философия Unix: пишите программы, которые делают одно и делают это хорошо. Напишите программы для совместной работы.1
В этом случае mkdir
а также rm
Команды делают то, что вам нужно, и хорошо работают вместе, так как rm -r
удалит также каталог, поэтому последующий mkdir
создаст каталог.
1 Искусство программирования Unix, Эрик С. Рэймонд, сам цитирует Дуга Макилроя.
Чтобы сделать это самым чистым способом, я использую это:
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
Убедитесь, что файл с таким именем не существует. если это так, распечатайте сообщение об ошибке и выйдите.Создайте новый каталог и повторите эхо, или, если не удалось, эхо не удалось.
Команда для удаления каталога rm
, Итак, вам нужно 2 команды.
rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/
Как показано в комментариях, вы можете связать их ;
(= сделать оба, даже если 1-й сбой) или &&
(= только mkdir, когда rm не выходит из строя).
-r
для удаления dirs. 1-я команда также удаляет ВСЕ содержимое каталога. Если это НЕ ваше намерение, то rm и mkdir - это не то, что вы ищете: права доступа chmod
а также chown
,
почему у mkdir нет этой опции?
Неоднозначность. mkdir
значит сделать каталог. Не удаляйте и делайте каталог. И так как rm
команда для удаления материала, нет необходимости rmdir
чтобы иметь возможность удалить каталог.