Estou escrevendo um makefile que irá limpar alguns arquivos inúteis no final da compilação. Se um destino já foi estabelecido, é claro que ele será ignorado e o arquivo inútil pode não estar lá. Então, se eu fizer isso:
rm lexer.ml interpparse.ml interpparse.mli
Posso receber erros porque um dos arquivos não existe. Existe alguma maneira de dizer rm
para ignorar esses arquivos?
Ao ler a página do manual, vejo a seguinte opção:
-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.
Parece quase o que eu quero, mas não tenho muita certeza sobre a parte de permissões. Existe uma maneira de fazer isso?
rm
em uma caixa de areia? Parece que-f
faz exatamente o que você deseja, independentemente do globbing.-f
ainda tentará excluí-lo. Isso irá falhar. Não lhe dirá que falhou. Útil se o nome do arquivo for uma variável ou um glob.rm --interactive=never
que age como,rm -f
exceto que retorna um status de saída de erro. consulte aqui para obter mais detalhes: unix.stackexchange.com/questions/72864/…Respostas:
A
-f
opção é definitivamente o que você deseja usar.A confirmação sobre as permissões de arquivo a que se refere é esta:
Então
rm
, você será avisado se tentar excluir um arquivo no qual você não tem permissão de gravação. Isso é permitido se você tiver permissões de gravação no diretório, mas é um pouco estranho, e é por isso querm
normalmente o alerta sobre isso.fonte
-i
.set -e
em todos os meus scripts bash para que o script saia após qualquer comando dar um erro. Geralmente, quero que um script me diga serm
ocorreu um erro, mas continue assim mesmo. continuou.Outra solução é esta: https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command
Basta adicionar uma instrução OR após o seu comando:
Dessa forma, quando a instrução nº 1 falhar (gera erro), execute a instrução nº 2, que é simples
true
.fonte
rm -rf my/dir ||:
para ser ainda mais concisa (:
é curto paratrue
)Estou muito atrasado para a festa, mas uso isso o tempo todo. Em um makefile, adicione
-
ao início de uma linha para ignorar o valor de retorno dessa linha. Igual a:fonte
Se você não quiser usar a opção -f, uma alternativa é:
Isso evitará que erros sejam impressos.
fonte
Se você encontrar uma maneira de divulgar os nomes dos arquivos,
rm
não reclamará se não encontrar uma correspondência. Portanto, algo comolexer.m* interpparse.*
etc. deve funcionar para você (tenha cuidado para não excluir muito, é claro). Além disso,-f
é um caminho perfeitamente razoável, desde que você não espere que as permissões de arquivo o impeçam de excluir um arquivo que você não desejava - se você não quiser excluí-lo, não o coloque na lista.fonte
sudo rm -rf
.lexer.m?
...? Isso pegarialexer.ml
elexer.mz
, mas nãolexer.mll
oulexer.mla
.A opção -f significa que você não será solicitado se algo não for o esperado. Isso não significa que as permissões não sejam levadas em consideração.
Se você não tiver privilégios suficientes para remover um arquivo, ele não será removido.
MAS , se você tiver privilégios suficientes para alterar privilégios, seu arquivo será removido. É o caso de você ser o proprietário de um arquivo com permissões somente leitura para o proprietário (-r --------). Como proprietário, você pode
chmod u+w
removê-lo:rm -f
removerá esse arquivo.fonte
Talvez possa ajudar uma linha semelhante com:
Eu sei que isso não é muito inteligente, mas faz o trabalho.
fonte
Uma alternativa:
Pena que Makefiles não podem compartilhar definições de funções de shell entre linhas.
fonte
Aqui está o que eu uso em scripts de shell. Ele oculta a mensagem de erro e o código de erro.
fonte
rm doesnotexist 2&> /dev/null
você pode tocar nos arquivos antes de removê-los. que os criaria se eles não existirem :-)
fonte
escreva
rm -rf ppp>/dev/null 2>&1
você mais recente, obtenha mensagem de erro Problema ocorre, se o erro gerar não for STDERR 2, mas STDOUT 1 ... Ocorre quando o comando gera não erro, mas aviso. Você precisa definir o filtro e remover esta mensagem. Mas este caso é comum.fonte
teste para ver se o arquivo existe primeiro, se existir, depois passe para rm. Os erros de rm serão significativos. -f ou ignorar a mensagem de erro é geralmente mais abrangente do que o que uma pessoa deseja. -f pode fazer coisas que você não quer que sejam feitas.
adicione mais cláusulas de teste se houver mais arquivos que você deseja ter certeza de que existem.
fonte