Eu tenho um nome de diretório foo
localizado em ~/Desktop
. Suponha que eu queira criar um diretório a partir de um terminal com o mesmo nome e no mesmo local. Quando tentei mkdir
, deu um erro:
mkdir: cannot create directory `/home/nux/Desktop/foo': File exists
Isso faz sentido, mas eu quero substituir foo
se existir. Eu olhei através, man mkdir
mas não há nenhuma opção que faça isso.
Então, como substituir o foo
diretório?
Por que não mkdir
tem uma opção para fazer isso?
foo
como em excluir todo o conteúdo dele?mkdir
possui uma-p
opção que ignora se o diretório existe.Respostas:
Se seu objetivo é executar um comando de uma linha que:
~/Desktop/foo
se ele já existir.~/Desktop/foo
se ele ainda não existir.Então você pode usar:
;
é equivalente a uma nova linha, mas permite executar vários comandos em uma única linha (ou seja, como um "comando único").-f
sinalizador para removê-los sem avisar o usuário interativamente. Tudo bem, mas eu recomendo ser especialmente cuidadosorm -rf ...
. Vejaman rm
para detalhes.rm
comando termine antes damkdir
execução do comando; esta é a razão para usar em;
vez de&
. (Um comando anterior&
é executado de forma assíncrona em segundo plano.)mkdir
comando seja executado quando orm
comando for bem-sucedido; esta é a razão para usar em;
vez de||
.mkdir
comando seja executado quando orm
comando falhar (geralmente falha significa que o diretório ainda não existia); esta é a razão para usar em;
vez de&&
.rm
comando pode falhar mesmo quando o diretório já existe; nesse caso, omkdir
comando também falhará, mas as mensagens de erro farão sentido e provavelmente não há necessidade de adicionar uma etapa intermediária para verificarfoo
a existência antes de tentar criá-lo.Veja 3.2.3 listas de comandos no manual Bash Reference para mais informações e explicações sobre os
;
,&
,||
, e&&
operadores.Como o muru sugeriu (e Rinzwind elaborou ), eu recomendo que você
rsync
verifique se ele atenderá às suas necessidades de backup. Existem alguns guias úteis adicionais na página de documentação do rsync , bem como neste guia do rsync do Ubuntu .mkdir
cria diretórios (o "mk" significa "make" ). Também excluir diretórios recursivamente e todos os arquivos neles seriam ruins, porque violariam o princípio de menos espanto de uma maneira que provavelmente levaria à perda de dados.rmdir
nem remove os diretórios que possuem arquivos (que não sejam de diretório).rm
possui uma-r
opção, que faz sentido, poisrm
é esperado remover arquivos (esse é o seu objetivo, portanto, o perigo inerente é intuitivo e os usuários geralmente sabem que devem ter cuidado ao executarrm
comandos).fonte
Não, não existe um único comando para fazer o que você está pedindo.
Por quê?
Nesse caso, os comandos
mkdir
erm
fazem o que você precisa e funcionam bem juntos, poisrm -r
também excluirão o diretório e, portanto, um subsequentemkdir
criará o diretório.1 The Art of Unix Programming , Eric S. Raymond, citando Doug McIlroy.
fonte
O comando para remover um diretório é
rm
. Então você precisa de 2 comandos.Conforme mostrado nos comentários, você pode encadear-los com
;
(= faça ambos, mesmo que o primeiro falhe) ou&&
(= apenas mkdir quando o rm não falhar).O
-r
é para remover diretórios. O 1º comando também remove TODO o conteúdo do diretório. Se essa não é a sua intenção, rm e mkdir não são o que você está procurando: as permissões sãochmod
echown
.Ambiguidade.
mkdir
significa criar diretório. Não remova e crie o diretório. E como orm
comando é para excluir coisas, não há necessidade dermdir
remover um diretório.fonte
Para fazer isso da maneira mais limpa, eu uso isso:
E para usá-lo:
Isso garante que o que você está tentando remover seja um diretório e não um arquivo:
-d
Verifique se um diretório com esse nome já existe. Nesse caso, exclua-o.-f
Verifique se não existe nenhum arquivo com esse nome. Nesse caso, imprima a mensagem de erro e saia.Crie o novo diretório e execute o eco com êxito ou, se falhar, o eco falhará.
fonte