Rm не повідомив про відсутність файлу?


38

У мене є скрипт bash, який я хочу видалити файли з різних каталогів. Часто їх там не буде, тому що вони не були створені, і це добре. Чи є спосіб отримати скрипт не повідомити про цю помилку, але якщо у rm є якийсь інший вихід, щоб повідомити про це?

Крім того, чи є краща команда для видалення файлу, який буде менш галасливим?

Відповіді:


65

Використовуйте -fопцію. Він мовчки ігнорує неіснуючі файли.

Від man rm:

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

[Частина "ніколи не підказує" означає, що (a) -fпереосмислює будь-який раніше вказаний параметр -iабо -Iопцію, і (b) файли, захищені записом, будуть видалені без запитування.]

Приклад

Без цього -f, rmскаржиться на відсутні файли:

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

З -f, воно буде мовчати:

$ rm -f nonesuch
$

4
О, я новий, який не запросив на видалення, не усвідомлював, що також ігнорував неіснуючі. Я повністю пропустив це, дивлячись на людину. :-) Дякую. Я позначу це як відповідь, як тільки мені дозволять.
мерехтіння

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
Варто бути в курсі дуже незначного шансу перегонового стану, коли файл видаляється (або створюється) між тестом і видаленням, але я не можу уявити, що це актуально в будь-якій типовій ситуації, коли використовується сценарій оболонки .
David Z

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, тому ви не побачите її під час запуску команди.


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опції перше, щоб переконатися , що він знайти файли , які ви очікуєте.


Мені подобається цей варіант і я буду розглядати зміни. Дякуємо, що поділилися цим.
мерехтіння

3

Перевірте --force( -f) варіант rm:

-f, - сила

ігноруйте неіснуючі файли та аргументи, ніколи не підказуйте


2

Це злом, але ви завжди touchзможете видалити файл. Якщо його не існує, він буде створений, щоб він rmміг його видалити.


Мені це подобається, за винятком продуктивності - наскільки дорого доторкатися до декількох файлів K на відміну від видалення лише тих, які не існують?
Dani_l

0

Ви можете використовувати -fяк буде, відповідно до сторінки man:

Спроба видалити файли, не вимагаючи підтвердження, незалежно від дозволів файлу. Якщо файл не існує, не показуйте діагностичне повідомлення та не змінюйте стан виходу, щоб відобразити помилку. також пам’ятайте, що опція -f перекриває будь-які попередні параметри -i.

rm -f xyz-directory

не підкаже вам нічого, і зробить саме те, що ви хочете.


-1

Є два основні способи: Якщо ви додасте параметр -f, він не відображатиме помилку "не існує" і два: (працює майже для будь-якої команди), а не просто виконує "thecommand" do "thecommand 2> / dev / null "де" thecommand "- команда, яку ви виконуєте.


1
Я уникав трубопроводів, тому що не хочу втрачати інші помилки, які можуть виникнути. Я не знаю, якими вони були б.
мерехтіння
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.