289

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

rm lexer.ml interpparse.ml interpparse.mli

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

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

 -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.

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

12 ответов12

246

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

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

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

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

99

Вот еще одно решение: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

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

rm -rf my/dir || true

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

73

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

-rm lexer.ml interpparse.ml interpparse.mli
10

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

rm filethatdoesntexist 2> /dev/null 

Это только предотвратит печать ошибок.

7

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

5

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

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

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

3

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

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

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

2

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

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

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

2

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

rm doesnotexist 2> /dev/null || echo > /dev/null
0

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

0

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

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
0

проверьте, существует ли файл первым, если он существует, а затем передайте его в rm. Тогда ошибки от rm будут значимыми. -f или игнорирование сообщения об ошибке обычно более всеобъемлющее, чем то, что хочет человек. -f может делать то, что ты не хочешь делать.

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

добавьте больше тестовых предложений, если есть еще файлы, которые вы хотите быть уверенными в существовании.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .