Як запобігти RM повідомляти, що файл не знайдено?


155

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

  • Чи є -fваріант правильним способом замовкнути rm? Чому його не називають -q?
  • Чи робить цей варіант ще щось?

4
ви не хочете використовувати -f, він видаляє файл, який ви позначили як прочитаний.
піца

Відповіді:


209

Основне використання -f- примусити видалити файли, які не були б видалені за rmдопомогою самого себе (як особливий випадок, він "видаляє" неіснуючі файли, тим самим придушуючи повідомлення про помилку).

Ви також можете просто перенаправити повідомлення про помилку, використовуючи

$ rm file.txt 2> /dev/null

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


3
--fє дійсним для GNU Coreutils rm, але лише тому, що це унікальна абревіатура для --force. Коротка форма -fбільш чітка і портативна.
Кіт Томпсон

Не впевнений, що я навіть це зрозумів. --fтут просто помилка друку -f.
чепнер

2
що робить 2 у 2>?
Dan

@Maverick Він перенаправляє будь-які повідомлення, надіслані stderr в / dev / null, а не надсилає їх до терміналу.
Бенджамін Нолан

73

Так, -fце найбільш підходящий варіант для цього.


Деякі системи підкажуть, коли приміщення навіть з -f, поки ви не скористаєтеся похилою рисою.
vimdude

11
@vimdude: Це не "деякі системи"; що поведінка вказує на те, що у вас є функція оболонки або псевдонім , який зіставляє rmз rm -i.
Кіт Томпсон

28

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

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

це гарантує існування файлу та є звичайним файлом (а не каталогом, вузлом пристрою тощо).


4
Однак це має перегони, і його не слід використовувати у виробничих сценаріях.
tripleee

Я вважаю, що @tripleee вказує на те, що тест "-f" і видалення файлу можуть завершитися в будь-якому порядку. Ще один спосіб зробити це:, if [ -f "$THEFILE" ]; then rm "$THEFILE"; fiякий робить тест і дії для видалення файлів явно послідовними.
robla

2
@robla цей код робить те саме, що і з більш багатослівним синтаксисом ... &&! = & ... Тест завжди відбуватиметься перед rm, але окремий процес технічно (хоча й малоймовірно) може видалити його до запуску rm (поки оболонка код після інтерпретації тесту).
технозавр

technosaurus - ooops, ти маєш рацію. Як ви вважаєте, що найкраща відповідь на питання @ mmlac?
robla

3
І лише для підтвердження, умова гонки полягає в тому, що щось може видалити файл між testі rm. Тут жодного разу rmне можна було стратити test. Дивлячись перед тим, як стрибати, є поширеною помилкою одночасного програмування - ви вже не можете довіряти результату "вигляду", коли ви насправді "стрибаєте"; рішенням цього є використання замкових або атомних операцій. Саме тому ви хочете rm -f, що є прикладом останнього.
трійка

13

\rm -f file ніколи не повідомлять, не знайдено.


4
-R непотрібний і небезпечний.
mahemoff

1
Я припускав багато файлів чи каталогів. Перечитайте запит користувача, і ви маєте рацію, він просив лише файли. Так виправив мою відповідь
vimdude

Що таке зворотна косої риски перед тим, як RM робить ?? будь ласка, хлопці, мені потрібна відповідь на це. У Windows Cygwin, що робить версію 4.1, не може працювати з \ rm, тоді як 3.75 працює чудово.
Айман Салах

2
@AymanSalah Зворотна косої риски в цьому контексті дозволить уникнути будь-якої функції або псевдоніму, що перетворює реальне rm(як це було популярно на деяких сайтах на початку 1990-х, щоб запобігти початківцям видаляти речі, а потім викликати sysadmin, щоб повернути свої файли).
трійка

Дякую - це вирішило мою проблему. Мабуть, код виходу дозволяє використовувати ланцюги, використовуючи &&час, коли без -f зламається, коли файл не знайдений.
Ігор

5

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


-9

У мене була така ж проблема для cshell. Єдиним рішенням у мене було створити фіктивний файл, який би відповідав шаблону перед "rm" у моєму сценарії.


7
Це було насправді єдине рішення? Ви спробували rm -fчи rm filename >&/dev/null?
Кіт Томпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.