verifique se o diretório existe e exclua em um comando unix

106

É possível verificar se existe um diretório e deletar se existir, no Unix usando um único comando? Eu tenho uma situação em que uso a tarefa ANT 'sshexec' onde posso executar apenas um único comando na máquina remota. E eu preciso verificar se o diretório existe e excluí-lo ...

remo
fonte
por que não usar apenas rmdir? se o diretório não existir, ele falhará.
Ferruccio
4
Isso irá falhar. E erro no meu script ANT. Isso fará com que minha construção falhe.
remo
O uso mkdir -pirá ignorar os erros se já existirem.
user562374
2
@ Ferruccio- usar rm -rf / dir_name não gera um erro, mas rm -rf / dir_name lança diz Nenhum arquivo ou diretório encontrado. (Acabei de testar)
remo
3
@remo mano você postou o mesmo comando duas vezes
Marcos Pereira

Respostas:

149

Supondo que $WORKING_DIResteja definido como o diretório ... este one-liner deve fazer isso:

if [ -d "$WORKING_DIR" ]; then rm -Rf $WORKING_DIR; fi

(caso contrário, apenas substitua pelo seu diretório)

Nick Grealy
fonte
161

Por que não apenas usar rm -rf /some/dir? Isso removerá o diretório se estiver presente, caso contrário, não faça nada. Ao contrário rm -r /some/dirdeste tipo de comando não irá travar se a pasta não existir.

Dominic Mitchell
fonte
13
Acho que a questão original pretendia significar: realizar a exclusão apenas quando o arquivo / diretório existir ou não. Este comando pode funcionar e produzir resultados semelhantes, mas realmente fazer um teste antes do comando faz mais sentido.
Ankur Chauhan
5
@AnkurChauhan +1, recebo um aviso se o dir não existir.
inf3rno
12
Esta não é a resposta para a pergunta.
xpto
10
Como afirmado acima, esta não é a resposta. Um motivo para testar antes de excluir está dentro de um trabalho do Jenkins. Se o diretório não existir e você tentar excluí-lo, o trabalho falhará. Verificar antes é a melhor opção.
lenhador em
8
Acho que essa é a resposta correta. ele faz o que @remo precisa, ou seja, deletar um diretório apenas se ele existir e não dar erro se não existir. Talvez a questão não esteja bem colocada porque porque você precisaria verificar a existência quando este comando não se importa ?!
pedram bashiri
32

Experimentar:

bash -c '[ -d my_mystery_dirname ] && run_this_command'

EDITAR : Isso funcionará se você puder executar o bash na máquina remota ....

EDIT 2 : No bash, [ -d something ]verifica se existe um diretório chamado 'algo', retornando um código de sucesso se existir e for um diretório. O encadeamento de comandos com && executa o segundo comando apenas se o primeiro for bem-sucedido. Portanto, [ -d somedir ] && commandexecuta o comando apenas se o diretório existir.

sinelaw
fonte
Sim, e experimente em um shell para ter certeza de que é o que você deseja.
sinelaw
Primeiro quero ver se funciona localmente e posso enviar o comando remotamente. Estou dizendo para verificar o diretório "/ test" .. just [-d / test] && mkdir / test?
remo
1
Deve dar um erro se existir, pois verifica se o diretório existe e se sim tenta criá-lo. Isso é o que ele faz por mim (acabei de testar). Não deve criar um diretório. Como você deseja EXCLUIR, provavelmente precisará de: [ -d /test ] && rmdir /test(ou rm -rf / test se não estiver vazio e você quiser excluir todo o conteúdo)
sinelaw
@SineLaw: NOTA - Não deu erro quando o diretório existia para mim, e tentando criar um diretório! (testei novamente). Mas para DELETE funciona. Verifique isso
remo
sharma: você está usando o bash? o que 'echo $ SHELL' diz?
sinelaw
0

Aqui está outro forro:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && significa executar a instrução seguinte apenas se a instrução anterior for executada com sucesso (código de saída zero retornado)
Akhilesh Joshi
fonte