Как заставить rm не выдавать ошибку, если файл не существует?

Я пишу makefile, который очистит некоторые бесполезные файлы в конце компиляции. Если цель уже сделана, она, конечно же, пропустит эту цель, и бесполезный файл может отсутствовать. Поэтому, если я это сделаю:

rm lexer.ml interpparse.ml interpparse.mli

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

При чтении справочной страницы я вижу следующую опцию:

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

Это похоже на почти , что я хочу, но я не уверен в части разрешений. Есть ли способ сделать это?

253 голоса | спросил Jason Baker 27 52009vEurope/Moscow11bEurope/MoscowFri, 27 Nov 2009 19:43:23 +0300 2009, 19:43:23

11 ответов


217

Опция -f - это то, что вы хотите использовать.

Подтверждение о разрешении файла, на которое он ссылается, следующее:

$ touch myfile
$ chmod 400 myfile
$ rm myfile
rm: удалить защищенный от записи обычный пустой файл `myfile '?

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

ответил Dave Webb 27 52009vEurope/Moscow11bEurope/MoscowFri, 27 Nov 2009 19:54:52 +0300 2009, 19:54:52
76

Другим решением является следующее: https://stackoverflow.com/questions /11231937 /Баш-игнорирование ошибки-в-а-конкретной команды-

Просто добавьте OR-инструкцию после вашей команды:

rm -rf my /dir || правда

Таким образом, когда оператор # 1 терпит неудачу (выдает ошибку), запустите оператор # 2, который просто true.

ответил Giel Berkers 9 MarpmMon, 09 Mar 2015 15:39:25 +03002015-03-09T15:39:25+03:0003 2015, 15:39:25
68

Я опоздал на вечеринку, но я все время использую это. В make-файле добавьте - в начало строки, чтобы игнорировать возвращаемое значение этой строки. Например:

-rm lexer.ml interpparse.ml interpparse.mli
ответил Robert Li 24 MonEurope/Moscow2012-12-24T03:12:06+04:00Europe/Moscow12bEurope/MoscowMon, 24 Dec 2012 03:12:06 +0400 2012, 03:12:06
8

Если вы не хотите использовать опцию -f, альтернатива:

rm filethatdoesntexist 2> /DEV /нуль

Это приведет к тому, что ошибки не будут напечатаны.

ответил user135299 12 J0000006Europe/Moscow 2012, 23:46:48
7

Если вы найдете способ glob имена файлов, rm не будет жаловаться, если он не может найти совпадение. Так что что-то вроде lexer.m * interpparse. * и т. Д. Должно работать на вас (будьте осторожны, вы не слишком много удаляете, конечно). Кроме того, -f - это совершенно разумный способ пойти, если вы не надеетесь, что разрешения на файл сохранят вас от удаления файла, который вам не нужен, - если вы не хотите чтобы удалить его, не помещайте его в список.

ответил Nick Bastin 27 52009vEurope/Moscow11bEurope/MoscowFri, 27 Nov 2009 19:48:43 +0300 2009, 19:48:43
5

Параметр -f означает, что вам не будет предложено, если что-то не так, как ожидалось. Это не означает, что разрешения не принимаются во внимание.

Если у вас недостаточно прав для удаления файла, он не будет удален.

НО , если у вас достаточно прав для изменения привилегий, файл будет удален. Это тот случай, когда вы являетесь владельцем файла с правами на чтение для владельца (-r --------). Как владелец, вы можете chmod u + w, а затем удалить его: rm -f удалит этот файл.

ответил mouviciel 27 52009vEurope/Moscow11bEurope/MoscowFri, 27 Nov 2009 22:27:29 +0300 2009, 22:27:29
3

Может быть, может помочь строка, похожая на:

touch fakefile.exe fakefile.o & & & & rm * .o * .exe

Я знаю, что это не очень умно, но он выполняет эту работу.

ответил Bogdan 11 MarpmFri, 11 Mar 2011 13:36:07 +03002011-03-11T13:36:07+03:0001 2011, 13:36:07
2

Альтернатива:

RmIfIsFile () {для f в "$ @"; do [-f $ f] & & & rm $ f; сделанный; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli

Слишком плохо Makefiles не может делиться описаниями функций оболочки между строками.

ответил reinierpost 27 52009vEurope/Moscow11bEurope/MoscowFri, 27 Nov 2009 20:44:12 +0300 2009, 20:44:12
2

Вот что я использую в сценариях оболочки. Он скрывает сообщение об ошибке и код ошибки.

rm doesnotexist 2> /dev /null || эхо> /DEV /нуль
ответил teh_senaus 11 J0000006Europe/Moscow 2015, 16:55:15
0

вы можете прикоснуться к файлам, прежде чем вы их запустите. которые создавали бы их, если они не существуют: -)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
ответил commonpike 2 FebruaryEurope/MoscowbThu, 02 Feb 2017 19:11:37 +0300000000pmThu, 02 Feb 2017 19:11:37 +030017 2017, 19:11:37
0

напишите rm -rf ppp> /dev /null 2 ​​& 1 вы начинаете получать сообщение об ошибке. Проблема возникает, если ошибка генерируется не в STDERR 2, а в STDOUT 1 ... Это происходит, когда команда генерирует не ошибку, а предупреждение. Вам необходимо установить фильтр и удалить это сообщение. Но этот случай является обычным.

ответил Anatoly 19 PM000000120000003631 2017, 12:47:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132