Rm не сообщает, когда файл отсутствует?

39

У меня есть скрипт bash, который я хочу удалить файлы из разных каталогов. Часто их не будет, потому что они не были созданы, и это нормально. Есть ли способ заставить скрипт не сообщать об этой ошибке, но если у rm есть какой-то другой вывод, чтобы сообщить об этом?

С другой стороны, есть ли лучшая команда для удаления файла, который будет менее шумным?

flickerfly
источник

Ответы:

67

Используйте -fопцию. Он будет молча игнорировать несуществующие файлы.

От man rm:

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

[Часть «никогда не запрашивать» означает, что (а) -fпереопределяет любой ранее указанный параметр -iили -I(б) файлы, защищенные от записи, будут удаляться без запроса.]

пример

Без -f, rmбудут жаловаться на отсутствующие файлы:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

С -f, будет тихо

$ rm -f nonesuch
$
John1024
источник
4
О, я новичок, который не запрашивал удаление, не осознавал, что также игнорировал несуществующие. Я полностью пропустил это, глядя на человека. :-) Спасибо. Я отмечу это как ответ, как только мне позволят.
flickerfly
9

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

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

Вызов rm -fфайла, который, например, не имеет разрешений на запись пользователя, удалит файл и также не выдаст обычное приглашение для этого сценария.

Если вы хотите использовать одну и ту же идею с несколькими файлами, я бы создал определение функции, например:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Используйте это как: qrm file1 file2-does-not-exist *.txt etc here

Джефф Шаллер
источник
1
Стоит знать об очень малой вероятности возникновения состояния гонки, когда файл удаляется (или создается) между тестом и удалением, но я не могу представить, что это уместно в любой типичной ситуации, когда можно использовать сценарий оболочки ,
Дэвид З
7

Вы заявили, что по-прежнему хотите видеть другие выходные данные rmкоманды при ее запуске, но использование этой -fопции подавит их. Вам нужно будет отфильтровать STDERR для того, что вы хотите, что немного сложно, если вы хотите, чтобы все остальное показывалось.

Вы захотите использовать такую ​​команду:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Команда объяснила:

  • -f Аргумент должен проходить, а не запрашивать подтверждение или ошибки
  • 3>&1 1>&2 2>&3 3>&-это переключение между STDOUT и STDERR для фильтрации (вы можете прочитать об этом здесь, если хотите
  • | grep -v 'No such file or directory' отфильтровывает сообщение, которое вы не хотите видеть

Теперь, если вы просто хотите полностью исключить сообщения об ошибках, вы можете выполнить следующую команду:

rm filename 2> /dev/null

Эта команда перенаправляет STDERR в / dev / null, поэтому вы не увидите его при запуске команды.

BriGuy
источник
1
(AFAICS) rmбез -vвывода никогда в stdout, только в stderr, поэтому в этом случае вы могли бы просто 2>&1 | grepбез танца, который более полезен в целом,
dave_thompson_085
4

В качестве альтернативы вы можете использовать findкоманду с -deleteопцией. Это (очевидно) удалит только те файлы, которые он найдет, поэтому он никогда не предупредит, если их нет. Примером может быть:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

который будет искать в /var/log/triffids/каталоге и удалять все файлы с .logсуффиксом, которые не были изменены в течение более 30 дней.

Это всегда хорошая идея , чтобы запустить эти команды без в -deleteопции первых, чтобы убедиться , что он найти файлы , которые вы ожидаете.

seumasmac
источник
Мне нравится этот вариант и рассмотрит изменение. Спасибо, что поделились этим.
flickerfly
3

Проверьте --force( -f) вариант rm:

-f, --force

игнорировать несуществующие файлы и аргументы, никогда не запрашивать

heemayl
источник
2

Это взлом, но вы всегда touchможете удалить файл. Если он не существует, он будет создан, поэтому rmможете удалить его.

matega
источник
Мне нравится это, за исключением производительности - насколько дорого трогать несколько K файлов, а не удалять только те, которые не существуют?
Dani_l
0

Вы можете использовать, -fкак и будет, согласно странице руководства:

Попытайтесь удалить файлы без запроса подтверждения независимо от прав доступа к файлу. Если файл не существует, не отображайте диагностическое сообщение и не изменяйте состояние выхода для отражения ошибки. также помните, что параметр -f отменяет все предыдущие параметры -i.

rm -f xyz-directory

ничего вам не подскажет, и будет делать именно то, что вы хотите.

Анкит Джайн
источник
-1

Есть два основных способа: если вы добавите параметр -f, он не покажет ошибку «не существует» и два: (работает почти для любой команды) вместо того, чтобы просто выполнить «команду», выполнить команду 2> / dev / null ", где" thecommand "- это команда, которую вы выполняете.

Джон
источник
1
Я избегал трубопровода, потому что не хочу терять другие ошибки, которые могут возникнуть. Я не знаю, кем они будут.
flickerfly