Удалить файлы в каталоге без ошибок, если он уже пуст

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/*

С man-страницы:

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

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

depquid
источник
3
Наиболее очевидное решение, и я не думал об этом! Я чувствую себя первым парнем на этом комиксе xkcd.com/399 ;-)
Гюйгенс
6
find /tmp/our_cache/ -mindepth 1 -delete

Редактировать 1

удалены "-типа F

Редактировать 2

Добавлена ​​нестандартная опция -mindepth 1для предотвращения удаления корневого каталога поиска (после снятия -type fограничения).

Хауке Лагинг
источник
Просто примечание, я бы пропустил, -type fтак как могут быть и временные каталоги (хотя пример в вопросе не учитывает их, поэтому, вероятно, их там нет ...)
Izkata
1
Использование -type fудалит только обычные файлы, поэтому символические ссылки, например, не будут удалены.
Гюйгенс
@rush Извините, я не проверял это, но просто посмотрел справочные страницы с надписью «Удалить файлы», не говоря уже о каталогах. Я удаляю свой комментарий.
Хауке Лагинг
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
pradeepchhetri
источник
2
Не подавит ли это также ошибки, если, скажем, файл не может быть удален, потому что он используется? Единственная ошибка, которую я хочу подавить, это та, которая отображается, если целевой каталог пуст; похоже, что это будет иметь нежелательные побочные эффекты.
Марк Эмери
Даже если вы попытаетесь удалить какой-то файл, который открыл какой-то процесс, вы не получите ошибку.
Pradeepchhetri
1

Другой способ (хотя и немного перебор ...):

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

это использует testили [для проверки, не является ли строка, возвращенная при запуске в lsвашем каталоге, не пустой. Тогда, если и только если эта строка НЕ ​​пуста, она удалит все, что находится в вашем каталоге.

ПРИМЕЧАНИЕ: оставление шарика вне lsбудет подавлять ошибку отсутствия файлов.

h3rrmiller
источник
-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
Гюйгенс
источник