Substituir um diretório existente?

6

Eu tenho um nome de diretório foo localizado em ~/Desktop . Suponha que eu queira criar um diretório de um terminal com o mesmo nome e no mesmo local. Quando tentei mkdir , ocorreu 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 de man mkdir mas não há nenhuma opção que faça isso .

Então, como sobrescrever o diretório foo ?

Por que o mkdir não tem uma opção para fazer isso?

    
por nux 29.08.2014 / 00:27

3 respostas

10

Se o seu objetivo é executar um comando de uma linha que:

  • Remove e recria o diretório ~/Desktop/foo , se já existir.
  • Apenas cria o diretório ~/Desktop/foo , se ainda não existir.

Então você pode usar:

rm -r ~/Desktop/foo; mkdir ~/Desktop/foo

; é equivalente a uma nova linha, mas permite executar vários comandos em uma única linha (ou seja, como um "comando único").

  • Se o diretório que você está removendo pode conter arquivos readonly, você precisará do sinalizador -f para removê-los sem avisar o usuário interativamente. Tudo bem, mas eu recomendo ter cuidado especial com rm -rf ... . Veja man rm para detalhes.
  • Você precisa que o comando rm termine antes que o comando mkdir seja executado; este é o motivo para usar ; em vez de & . (Um comando que precede & é executado de forma assíncrona em segundo plano.)
  • Você precisa executar o comando mkdir quando o comando rm for bem-sucedido; este é o motivo para usar ; em vez de || .
  • Você precisa executar o comando mkdir quando o comando rm falhar (geralmente, a falha significará que o diretório ainda não existe); este é o motivo para usar ; em vez de && .
  • O comando rm pode falhar mesmo quando o diretório já existir, caso em que o comando mkdir também falhará, mas as mensagens de erro farão sentido e provavelmente não será necessário adicionar uma etapa intermediária à verificação de foo de existência antes de tentar criá-lo.

Veja 3.2.3 Listas de Comandos no Manual de referência do bash para obter mais informações e explicações sobre os operadores ; , & , || e && .

Como o muru sugeriu (e Rinzwind elaborado ), Eu recomendo que você olhe em rsync para ver se ele atende às suas necessidades de backup. Existem alguns guias úteis adicionais na página de documentação do rsync , bem como este guia rsync do Ubuntu .

  

porque o mkdir não tem essa opção?

mkdir cria diretórios (o "mk" significa "make" ). Para ele também recursivamente excluir diretórios e todos os arquivos neles seria ruim, porque violaria o princípio de menos espanto de uma forma que provavelmente levaria à perda de dados.

rmdir nem sequer remove diretórios que possuam nenhum ( não-diretório) arquivos neles. rm tem uma opção -r , o que faz sentido, pois espera-se que rm remover arquivos (essa é sua finalidade, portanto, o perigo inerente é intuitivo e os usuários geralmente sabem que devem ter cuidado ao executar comandos rm ).

    
por Eliah Kagan 29.08.2014 / 01:10
6

Não, não há um comando único para fazer o que você está pedindo.

Por quê?

  
    

Esta é a filosofia Unix: Escreva programas que façam uma coisa e façam bem. Escreva programas para trabalhar juntos. 1

  

Nesse caso, os comandos mkdir e rm fazem o que você precisa e funcionam bem juntos, pois rm -r excluirá o diretório também, portanto, um mkdir subseqüente criará o diretório.

1 A arte da programação Unix Eric S. Raymond, citando Doug McIlroy.

    
por muru 29.08.2014 / 00:56
3

O comando para remover um diretório é rm . Então você precisa de 2 comandos.

rm -r ~/Desktop/foo/
mkdir ~/Desktop/foo/

Como mostrado nos comentários, você pode encadeá-los com ; (= fazer os dois, mesmo se primeiro falhar) ou && (= apenas mkdir quando o rm não falhar).

O -r é para remover dirs. O primeiro comando também remove TODOS os conteúdos do diretório. Se essa não for sua intenção, tanto o rm quanto o mkdir não são o que você está procurando: as permissões são chmod e chown .

  

porque o mkdir não tem essa opção?

Ambiguidade. mkdir significa criar diretório. Não remova e faça o diretório. E como o comando rm é para excluir itens, não é necessário que rmdir consiga remover um diretório.

    
por Rinzwind 29.08.2014 / 00:36