Перезаписать существующий каталог?

У меня есть имя каталога foo расположенный в ~/Desktop. Предположим, что я хочу создать каталог из терминала с тем же именем и в том же месте. Когда я попробовал mkdir это дало ошибку:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

Это, имеет смысл, но я хочу заменить foo если существует. Я просмотрел man mkdir но нет никакой опции, которые делают это.

Таким образом, как перезаписать foo каталог?

Почему не делает mkdir имеет опция, чтобы сделать это?

9
задан 20 October 2014 в 12:59

4 ответа

Если Ваша цель состоит в том, чтобы выполнить короткую команду что:

  • Удаляет и воссоздает каталог ~/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 команды).

17
ответ дан 23 November 2019 в 04:46

Нет, нет никакой единственной команды, чтобы сделать то, что Вы спрашиваете.

, Почему?

Это - философия Unix: Запишите программы, которые делают одну вещь и делают это хорошо. Запишите программы для сотрудничества. <глоток> 1

В этом экземпляре, mkdir и rm команды делают то, чего Вы требуете и работаете хорошо вместе, с тех пор rm -r удалит каталог также, таким образом, последующее mkdir создаст каталог.

<глоток> 1 Искусство Программирования Unix, Eric S. Raymond, самого заключая Doug McIlroy в кавычки.

7
ответ дан 23 November 2019 в 04:46

Команда для удаления каталога rm. Таким образом, Вам нужны 2 команды.

rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/

Как показано в комментариях можно объединить их в цепочку с ; (=, делают обоих, даже если 1-е сбои) или && (= только mkdir, когда комната не перестала работать).

Эти -r для удаления директоров, 1-я команда также удаляет ВСЕ содержание каталога. Если это не Ваше намерение и комната и mkdir, не то, что Вы ищете: полномочия chmod и chown.

то, почему mkdir не делает, имеет эту опцию?

Неоднозначность. mkdir средства делают каталог. Не удаляют и делают каталог. И начиная с эти rm команда для удаления материала нет никакой потребности в rmdir, чтобы быть в состоянии удалить каталог.

3
ответ дан 23 November 2019 в 04:46

Чтобы сделать это самым чистым способом, я использую это:

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>

Это удостоверяется, что то, что Вы пытаетесь удалить, является каталогом и не файлом:

  1. -d Проверка, если каталог с тем именем уже существует. если так, удалите его.

  2. -f Проверка, что никакой файл с этим именем не существует. если так, сообщение об ошибке печати и выход.

  3. Создают новый каталог и успех эха, или, если отказавший, отказавшее эхо.

1
ответ дан 23 November 2019 в 04:46

Другие вопросы по тегам:

Похожие вопросы: