Перезаписати існуючий каталог?


11

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

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

Це має сенс, але я хочу замінити, fooякщо існує. Я переглянув, man mkdirале не існує жодного варіанту, який би це зробив.

Отже, як перезаписати fooкаталог?

Чому немає mkdirможливості зробити це?


Замінити fooяк видалити весь вміст із нього? mkdirмає -pопцію, яка ігнорує, чи існує каталог.
muru

4
Отже, ви хочете команду, яка видалить усі файли в каталозі, коли ви випадково створили новий каталог з тим самим іменем? І вам цікаво, чому це не будь-який варіант? Це жарт?
Марті Фрід

downvoters просто уточнюють, чому це, я запитую про одну команду, яка видаляє існуючий каталог
nux

1
@nux для мене питання не має сенсу ... поясніть, чому ви хочете видалити та відтворити каталог. У нас є команди для всього, що вам потрібно зробити в каталозі. mkdir не потребує опції для видалення / відтворення.
Rinzwind

1
це злочин тут, якщо я задаю логічне запитання !!
nux

Відповіді:


21

Якщо ваша мета - виконати однорядну команду, яка:

  • Вилучає та відтворює каталог, ~/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 Reference Manual для отримання додаткової інформації та роз'яснень про ;, &, ||і &&операторів.

Як запропонував Мурурозробив Rinzwind ), я рекомендую вам заглянути,rsync щоб побачити, чи відповідає це вашим потребам резервного копіювання. На сторінці документації rsync є кілька додаткових корисних посібників , а також цей посібник з rsync Ubuntu .

чому mkdir не має такої опції?

mkdirстворює каталоги ("mk" означає "make" ). Для нього також буде рекурсивно видаляти каталоги та всі файли в них було б погано, оскільки це порушило б принцип найменшого здивування таким чином, що, ймовірно, призведе до втрати даних.

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


+1 відмінно. Ця відповідь іде вище та далі в поясненні синтаксису, я хотів би більш глибокого на сайтах stackexchange. У цій відповіді багато золотих самородків.
Говінд Рай

7

Ні, немає жодної команди виконувати те, що ви просите.

Чому?

Це філософія Unix: Пишіть програми, які роблять одне і роблять це добре. Пишіть програми для спільної роботи. 1

У цьому випадку команди mkdirі rmкоманди виконують все, що вам потрібно, і добре працюють разом, оскільки rm -rбуде видалено і каталог, тому наступний файл mkdirстворить.

1 Мистецтво програмування Unix , Eric S. Raymond, сам цитував Дуг Макілрой.


Поки що, це хороша відповідь, я шукаю це
nux

3

Команда для видалення каталогу є rm. Отже, вам потрібно 2 команди.

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

Як показано в коментарях, ви можете зв'язати їх ланцюжками ;(= робити обидва, навіть якщо 1-ий не вдасться) або &&(= лише mkdir, коли rm не виходить з ладу).

-rДля видалення директорій. Перша команда також видаляє ВСІ вміст каталогу. Якщо це НЕ, ваш намір і rm, і mkdir - це не те, що ви шукаєте: дозволи chmodта chown.

чому mkdir не має такої опції?

Неоднозначність. mkdirозначає зробити каталог. Не видаляти та робити каталог. А оскільки rmкоманда призначена для видалення матеріалів, не потрібно rmdirвидаляти каталог.


Я знаю це, але я маю на увазі одну команду, ви можете переглянути мою редагування і змінити її
nux

1-е поясніть, чому потрібно відтворити каталог. Це не має для мене сенсу.
Rinzwind

чи моя сенс має сенс, я просто цікавлюсь, як? це має сенс для мене :)
nux

@nux ні, це не так. І ні те, хто підтримує mkdir, не розуміє, чому;) Те, що ви хочете, марне і не має жодних заслуг.
Rinzwind

ОК, якщо ви хочете знати, що я створюю сценарій, щоб зробити резервну копію в новому каталозі з тим же ім'ям foo і дозволяє замінити його, якщо існує, щоб зменшити простір
nux

1

Для цього найчистішим способом я користуюся цим:

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. Створіть нову директорію та відлуння успіху, або якщо не вдалося, відлуння не вдалося.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.