Я пишу 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.
Это походит почти, что я хочу, но я не действительно уверен в части полномочий. Существует ли способ сделать это?
-f
опция определенно, что Вы хотите использовать.
Подтверждение о полномочиях файла, к которым это относится, является этим:
$ touch myfile
$ chmod 400 myfile
$ rm myfile
rm: remove write-protected regular empty file `myfile'?
Так rm
предупредит Вас, при попытке удалить файл, у Вас нет полномочий записи на. Это позволяется, если у Вас есть полномочия записи на каталоге, но является немного странным, который является почему rm
обычно предупреждает Вас об этом.
Если Вы находите некоторый путь к шарику именами файлов, rm
не будет жаловаться, не может ли это найти соответствие. Так что-то как lexer.m* interpparse.*
, и т.д. должен работать на Вас (быть осторожным, Вы не удаляете слишком много, конечно). Кроме того, -f
совершенно разумный путь состоит в том, чтобы пойти, пока Вы не надеетесь, что полномочия файла сохранят Вас от удаления файла, который Вы не хотели к - если Вы не хотите удалять его, не помещайте его в список.
-f опция означает, что Вам не предложат, если что-то не будет как ожидалось. Это не означает, что полномочия не приняты во внимание.
Если у Вас будет недостаточно полномочий удалить файл, то он не будет удален.
НО, если у Вас есть достаточно полномочий изменить полномочия, Вы регистрируете, будет удален. Дело обстоит так, когда Вы - владелец файла с полномочиями только для чтения для владельца (-r--------). Как владелец, Вы можете chmod u+w
, затем удалите его: rm -f
удалит тот файл.
Альтернатива:
RmIfIsFile() { for f in "$@"; do [ -f $f ] && rm $f; done; }; RmIfIsFile lexer.ml interpparse.ml interpparse.mli
Слишком плохие Make-файлы не могут совместно использовать определения функции оболочки через строки.