Как запретить rm сообщать, что файл не найден?

155

Я использую rmв сценарии BASH, чтобы удалить много файлов. Иногда файлы отсутствуют, поэтому он сообщает о многих ошибках. Мне не нужно это сообщение. Я искал на странице справочника команду, чтобы заставить rmзамолчать, но единственная опция, которую я нашел, это то -f, что из описания «игнорировать несуществующие файлы, никогда не запрашивать», кажется, правильный выбор, но название не подходит Я обеспокоен тем, что это может иметь непредвиденные последствия.

  • Является ли -fвариант правильным способом заставить замолчать rm? Почему это не называется -q?
  • Эта опция делает что-нибудь еще?
Деревня
источник
4
Вы не хотите использовать -f, он удаляет файл, который вы пометили как только для чтения.
пицца

Ответы:

209

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

Вы также можете просто перенаправить сообщение об ошибке, используя

$ rm file.txt 2> /dev/null

(или эквивалент вашей операционной системы). Вы можете проверить значение $? сразу после вызова, rmчтобы увидеть, был ли файл фактически удален или нет.

chepner
источник
3
--fдействительно для GNU Coreutils rm, но только потому, что это уникальное сокращение для --force. Короткая форма -fболее четкая и более переносимая.
Кит Томпсон
Не уверен, что я даже понял это. --fвот только опечатка для -f.
chepner
2
что делает 2 в 2>?
Дан
@Maverick Он перенаправляет все сообщения, отправленные на stderr, в / dev / null, а не отправляет их на терминал.
Бенджамин Нолан
73

Да, -fэто самый подходящий вариант для этого.

Satya
источник
Некоторые системы подскажут вам, когда будет место даже с -f, пока вы не используете обратную косую черту.
vimdude
11
@vimdude: Это не "некоторые системы"; такое поведение означает, что у вас есть функция оболочки или псевдоним, который отображается rmна rm -i.
Кит Томпсон
28

-f - правильный флаг, но для оператора теста, а не rm

[ -f "$THEFILE" ] && rm "$THEFILE"

это гарантирует, что файл существует и является обычным файлом (не каталогом, узлом устройства и т. д.)

technosaurus
источник
4
Однако это имеет условие гонки и не должно использоваться в производственных сценариях.
tripleee
Я считаю, что @tripleee указывает на то, что тест "-f" и удаление файла могут выполняться в любом порядке. Еще один способ сделать это:, if [ -f "$THEFILE" ]; then rm "$THEFILE"; fiкоторый делает тест и шаги удаления файла явно последовательными.
Робла
2
@robla этот код делает то же самое с более подробным синтаксисом ... &&! = & ... Тест всегда будет выполняться до rm, но отдельный процесс может технически (хотя и очень маловероятно) удалить его до запуска rm (пока оболочка код после теста интерпретируется).
технозавр
технозавр - упс, ты прав. Как вы думаете, что является лучшим ответом на вопрос @ mmlac?
Робла
3
И просто чтобы подтвердить, условие гонки - что-то может удалить файл между testи rm. Там нет никакого способа, rmчтобы выполнить раньше testздесь. Смотреть перед прыжком - это распространенная ошибка в параллельном программировании - вы не можете больше доверять результату «взгляда», когда вы действительно «скачок»; решение этой проблемы заключается в использовании блокировки или атомарных операций. Именно поэтому вы хотите rm -f, который является примером последнего.
tripleee
13

\rm -f file никогда не сообщать не найден.

vimdude
источник
4
-R является ненужным и опасным.
mahemoff
1
Я предполагал много файлов или каталогов. Перечитайте запрос пользователя и вы правы, он спрашивает только файлы. Так что поправил мой ответ
vimdude
Что такое обратная косая черта до того, как rm делает ?? пожалуйста, ребята, мне нужен ответ на это. В windows cygwin make version 4.1 не может работать с \ rm, в то время как 3.75 работает просто отлично.
Айман Салах
2
@AymanSalah Обратная косая черта в этом контексте будет исключать любую функцию или псевдоним, заключающий в себе реальное rm(как это было популярно на некоторых сайтах в начале 1990-х годов, чтобы не дать новичкам удалить что-либо, а затем вызвать системного администратора для возврата своих файлов).
tripleee
Спасибо - это решило мою проблему .. по-видимому, код выхода позволяет использовать цепочку, в &&то время как без -f он ломается, когда файл не найден.
Игорь
5

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

Idelic
источник
-9

У меня была такая же проблема для cshell. Единственное решение, которое у меня было, это создать фиктивный файл, который соответствовал шаблону перед "rm" в моем скрипте.

Niranjan
источник
7
Это действительно единственное решение? Ты пробовал rm -fили rm filename >&/dev/null?
Кит Томпсон