2009-11-27 16:43:23 +0000 2009-11-27 16:43:23 +0000
347
347
Advertisement

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

Advertisement

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

rm lexer.ml interpparse.ml interpparse.mli

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

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

-f Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions. If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error. The -f option overrides any
             previous -i options.

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

Advertisement

Ответы (11)

296
296
296
2009-11-27 16:54:52 +0000

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

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

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file `myfile'?

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

132
132
132
2015-03-09 12:39:25 +0000

Другое решение: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

Просто добавьте OR-выражение после команды:

rm -rf my/dir || true

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

79
Advertisement
79
79
2012-12-23 23:12:06 +0000

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

-rm lexer.ml interpparse.ml interpparse.mli
14
14
14
2012-06-12 19:46:48 +0000

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

rm filethatdoesntexist 2> /dev/null

Это просто убережет от ошибок при печати.

8
Advertisement
8
8
2009-11-27 16:48:43 +0000

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

6
6
6
2009-11-27 19:27:29 +0000

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

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

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

5
Advertisement
5
5
2011-03-11 10:36:07 +0000

Может быть, помогла бы линия, похожая на:

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

Я знаю, что это не очень умно, но это делает работу.

3
3
3
2015-06-11 13:55:15 +0000

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

rm doesnotexist 2> /dev/null || echo > /dev/null
3
Advertisement
3
3
2009-11-27 17:44:12 +0000

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

RmIfIsFile() { for f in "$@"; do [-f $f] && rm $f; done; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli

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

1
1
1
2017-02-02 16:11:37 +0000

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

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
Advertisement
1
1
2017-08-19 09:47:36 +0000

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

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

6
10
11
37
5
Advertisement
Advertisement