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

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

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

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

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

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

Почему нет mkdirвозможности сделать это?

решение1

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

  • Удаляет и заново создает каталог, ~/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"означает «сделать»). Для него также рекурсивное удаление каталогов и всех файлов в них было бы плохим, потому что это нарушило быпринцип наименьшего удивлениятаким образом, что это с большой вероятностью приведет к потере данных.

rmdirдаже не удаляет каталоги, в которых есть какие-либо файлы (не являющиеся каталогами).rmимеет -rопцию, что имеет смысл, поскольку rmпредполагается удаление файлов (это ее цель, поэтому присущая ей опасность интуитивно понятна, и пользователи обычно знают, что при запуске rmкоманд следует соблюдать осторожность).

решение2

Нет, не существует единой команды, которая бы сделала то, о чем вы просите.

Почему?

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

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

1Искусство программирования Unix, Эрик С. Рэймонд, цитирующий Дуга Макилроя.

решение3

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

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

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

Для -rудаления каталогов. Первая команда также удаляет ВСЕ содержимое каталога. Если это НЕ ваше намерение, то и rm, и mkdir — не то, что вы ищете: разрешения — это chmodи chown.

почему у mkdir нет этой опции?

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

решение4

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

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. Создайте новый каталог и выполните команду echo «Успешно» или, в случае неудачи, команду echo «Не удалось».

Связанный контент