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

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

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

334
задан 27.11.2009, 18:43

5 ответов

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

Подтверждение о полномочиях файла, к которым это относится, является этим:

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

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

288
ответ дан 16.12.2019, 22:45

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

8
ответ дан 16.12.2019, 22:45

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

Если у Вас будет недостаточно полномочий удалить файл, то он не будет удален.

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

6
ответ дан 16.12.2019, 22:45

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

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

Слишком плохие Make-файлы не могут совместно использовать определения функции оболочки через строки.

3
ответ дан 16.12.2019, 22:45

Возможно, мог помочь строке, похожей с:

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

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

5
ответ дан 16.12.2019, 22:45

Теги

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