Видаліть файли в каталозі без помилок, якщо вони вже порожні


31

Як частина сценарію розгортання, я хочу скинути деякі кешовані матеріали з мого тимчасового каталогу. Я використовую таку команду, як:

rm /tmp/our_cache/*

Однак якщо /tmp/our_cacheвін порожній (досить поширений при натисканні багатьох змін у швидкій послідовності на нашому тестовому сервері), це друкує таке повідомлення про помилку:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

Це не велика справа, але це трохи некрасиво, і я хочу знизити співвідношення шум-сигнал у виході з цього сценарію.

Який стислий спосіб в unix видалити вміст каталогу, не отримуючи повідомлень, що скаржаться, що каталог вже порожній?

Відповіді:


48

Оскільки, імовірно, ви хочете видалити всі файли без підказки, чому б не просто використовувати -fперемикач, rmщоб ігнорувати неіснуючі файли?

rm -f /tmp/our_cache/*

З чоловічої сторінки:

-f, --force
          ignore nonexistent files, never prompt

Крім того, якщо в них можуть бути якісь підкаталоги, /tmp/our_cache/і ви хочете, щоб і ті, і їхній вміст були видалені, не забудьте -rперемикач.


3
Найбільш очевидне рішення, і я про це не думав! Я відчуваю себе першим хлопцем у цьому комічному xkcd.com/399 ;-)
Huygens

6
find /tmp/our_cache/ -mindepth 1 -delete

Редагуйте 1

вилучено "-типу f

Редагувати 2

Додано нестандартну опцію -mindepth 1, щоб запобігти видаленню кореневого каталогу пошуку (після зняття -type fобмеження).


Лише зауваження, я б пропустив, -type fоскільки там можуть бути і тимчасові каталоги (хоча приклад у запитанні не враховує їх, тому їх, мабуть, немає…)
Izkata

1
при використанні -type fбуде видалено лише звичайні файли, тому символічні посилання, наприклад, не будуть видалені.
Гюйгенс

@rush Вибачте, я цього не перевірив, але просто переглянув сторінки чоловіка, на яких написано "Видалити файли", не згадуючи про каталоги. Я видаляю свій коментар.
Hauke ​​Laging

1
Це видаляє, /tmp/our_cacheтак що ви можете також зробити rm -r /tmp/our_cache. Хоча ви використовуєте нестандартні параметри, ви можете використовувати -mindepth 1. Зауважте, що на відміну від цього rm /tmp/our_cache/*, він також видаляє підкаталоги та їх вміст та приховані файли.
Стефан Шазелас

2

Ви можете перенаправити стандартну помилку, щоб /dev/nullвона не надрукувала цю інформацію

$  rm /tmp/our_cache/* 2>/dev/null

2
Чи не буде це також придушенням помилок, які відображаються, якщо, скажімо, файл не можна видалити, оскільки він використовується? Єдина помилка, яку я хочу придушити, - це помилка, показана, якщо цільовий каталог порожній; це здається, що це мало б небажані побічні ефекти.
Марк Амері

Навіть якщо ви спробуєте видалити якийсь файл, який відкрив якийсь процес, ви не отримаєте помилку.
pradeepchhetri

1

Інший спосіб (хоч і трохи перебільшений ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

для цього використовується testабо [для тестування, якщо рядок, повернута з запуску a lsу вашому каталозі, не порожня. Тоді, якщо, і лише якщо цей рядок НЕ порожній, він видаляє все, що знаходиться у вашому каталозі.

ПРИМІТКА: залишення глобуса поза lsзаповітом придушить помилку відсутності файлів.


-1

Якщо ваш сценарій використовується в BASH, ви можете спробувати:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

Це все одно призведе до помилки, якщо є "справжня" проблема або якщо файл захищений (тоді вам знадобиться -fмодифікатор rmдля видалення файлів цього типу), але уникнете помилки, коли файлів немає.

Якщо для сценаріїв використовується інша оболонка, ніж BASH, наприклад zsh, ksh, ви можете спробувати інший синтаксис, який може бути більш портативним:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.