it-swarm-ru.tech

Если файл не существует?

Я пишу 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.

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

307
Jason Baker

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

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

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

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

266
Dave Webb

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

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

rm -rf my/dir || true

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

110
Giel Berkers

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

-rm lexer.ml interpparse.ml interpparse.mli
74
Robert Li

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

rm filethatdoesntexist 2> /dev/null 

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

12
user135299

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

8
Nick Bastin

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

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

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

6
mouviciel

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

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

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

4
Bogdan

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

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

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

3
reinierpost

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

rm doesnotexist 2> /dev/null || echo > /dev/null
3
teh_senaus

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

1
Anatoly

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

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
1
commonpike

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

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

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

1
user244488