shell script para remover um arquivo, se ele já existir
183
Estou trabalhando em algumas coisas em que estou armazenando dados em um arquivo. Mas cada vez que executo o script, ele é anexado ao arquivo anterior.
Quero ajuda sobre como remover o arquivo, se ele já existir.
Não se preocupe em verificar se o arquivo existe, tente removê-lo.
rm -f /p/a/t/h
# or
rm /p/a/t/h 2>/dev/null
Observe que o segundo comando falhará (retornará um status de saída diferente de zero) se o arquivo não existir, mas o primeiro será bem-sucedido devido à opção -f(abreviação de --force). Dependendo da situação, esse pode ser um detalhe importante.
Mas o mais provável é que, se você estiver anexando ao arquivo, é porque seu script está usando >>para redirecionar algo para o arquivo. Apenas substitua >>por >. É difícil dizer, pois você não forneceu nenhum código.
Observe que você pode fazer algo assim test -f /p/a/t/h && rm /p/a/t/h, mas fazê-lo é completamente inútil. É bem possível que o teste retorne verdadeiro, mas o / p / a / t / h deixará de existir antes de tentar removê-lo, ou pior, o teste falhará e o / p / a / t / h será criado antes de executar o próximo comando que espera que ele não exista. Tentar fazer isso é uma condição clássica de corrida. Não faça isso.
Isso não é útil se eles precisarem saber se existia e foi excluído. Comer stderr não fornece isso. Não lidar com a existência não permite que você execute um script mais amplo sem falhar.
Uchuugaka
@uchuugaka Esta é uma solução simples quando você não se importa se existe um arquivo, tudo o que você quer é garantir que ele não esteja lá.
Lukas Liesis
Boas respostas devem estar próximas e completas sobre os efeitos colaterais é a generalização da minha mensagem, mas os scripts de shell freqüentemente querem saber o que é ou não encontrado e o que é ou não acionado.
uchuugaka 27/01/19
rm /p/a/t/h 2> /dev/nullnão manterá o código de retorno ( echo $?) como 0 se o arquivo não existir. Isso faria com que os trabalhos de Jenkins falhassem apenas porque tentamos excluir um arquivo inexistente.
ViFI 30/05/19
@uchuugaka - Evitei responder a esse comentário há algum tempo, mas ele precisa ser resolvido. Verificar se o arquivo existe antes de excluí-lo é sempre uma má ideia. Veja o parágrafo final da minha resposta. Existe uma condição de raça inerente que simplesmente não pode ser evitada fazendo esse tipo de coisa. Se você não deseja sobrescrever um arquivo existente, tente alguma mágica específica do shell (como noclobberno bash) ou talvez modifique o arquivo existente para que o redirecionamento falhe se o arquivo existir (não evita a condição de corrida), mas tudo o que fará é tornar os bugs mais sutis.
Simples e fácil de ler e também garante que echo $?não dê 1 se o arquivo não existir.
ViFI 30/05/19
Se necessário, você também pode fazer isso como uma linha, veja minha resposta abaixo.
N
65
Se você deseja ignorar a etapa para verificar se o arquivo existe ou não, é possível usar um comando bastante fácil, que excluirá o arquivo se existir e não emitirá um erro se ele não existir.
rm $my_file
, certo? Qual shell você está usando?Respostas:
Não se preocupe em verificar se o arquivo existe, tente removê-lo.
Observe que o segundo comando falhará (retornará um status de saída diferente de zero) se o arquivo não existir, mas o primeiro será bem-sucedido devido à opção
-f
(abreviação de--force
). Dependendo da situação, esse pode ser um detalhe importante.Mas o mais provável é que, se você estiver anexando ao arquivo, é porque seu script está usando
>>
para redirecionar algo para o arquivo. Apenas substitua>>
por>
. É difícil dizer, pois você não forneceu nenhum código.Observe que você pode fazer algo assim
test -f /p/a/t/h && rm /p/a/t/h
, mas fazê-lo é completamente inútil. É bem possível que o teste retorne verdadeiro, mas o / p / a / t / h deixará de existir antes de tentar removê-lo, ou pior, o teste falhará e o / p / a / t / h será criado antes de executar o próximo comando que espera que ele não exista. Tentar fazer isso é uma condição clássica de corrida. Não faça isso.fonte
rm /p/a/t/h 2> /dev/null
não manterá o código de retorno (echo $?
) como 0 se o arquivo não existir. Isso faria com que os trabalhos de Jenkins falhassem apenas porque tentamos excluir um arquivo inexistente.noclobber
no bash) ou talvez modifique o arquivo existente para que o redirecionamento falhe se o arquivo existir (não evita a condição de corrida), mas tudo o que fará é tornar os bugs mais sutis.Outro comando de uma linha que usei é:
fonte
Você pode usar isto:
fonte
echo $?
não dê 1 se o arquivo não existir.Se você deseja ignorar a etapa para verificar se o arquivo existe ou não, é possível usar um comando bastante fácil, que excluirá o arquivo se existir e não emitirá um erro se ele não existir.
fonte
-f
argumento, não haveria erro. Esta resposta me ajudou, obrigado.Um script shell de um liner para remover um arquivo, se ele já existir (com base na resposta de Jindra Helcl):
[ -f file ] && rm file
ou com uma variável:
fonte
Algo assim funcionaria
-f verifica se é um arquivo comum
-e verifica se o arquivo existe
EDIT: -e usado com -f é redundante, fo usando -f sozinho deve funcionar também
fonte
-a
está obsoleto, use em-e
vez disso.-f
.-e
em-fe
é redundante, como-f
também verifica a existência do arquivo, tanto quanto eu sei ..if [ $( ls <file> ) ]; then rm <file>; fi
Além disso, se você redirecionar sua saída com, em
>
vez>>
dela, substituirá o arquivo anteriorfonte
file
é algo como5 -lt 2