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

У меня есть имя каталога 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, Эрик С. Рэймонд, сам цитирует Дуга Макилроя.

Команда для удаления каталога rm, Итак, вам нужно 2 команды.

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

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

-r для удаления dirs. 1-я команда также удаляет ВСЕ содержимое каталога. Если это НЕ ваше намерение, то rm и 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>

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

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

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

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

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