Перезаписать существующий каталог?
У меня есть имя каталога 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 чтобы иметь возможность удалить каталог.