web-dev-qa-db-fra.com

Remplacer un répertoire existant?

J'ai un nom de répertoire foo situé dans ~/Desktop. Supposons que je veuille créer un répertoire à partir d'un terminal portant le même nom et se trouvant au même endroit. Lorsque j'ai essayé mkdir, une erreur s'est produite:

mkdir: cannot create directory `/home/nux/Desktop/foo': File exists

C’est logique, mais je veux remplacer foo s’il existe. J'ai regardé à travers man mkdir mais aucune option ne le permet.

Alors, comment écraser le répertoire foo?

Pourquoi mkdir n'a-t-il pas la possibilité de le faire?

8
nux

Si votre objectif est d'exécuter une commande d'une ligne qui:

  • Supprime et recrée le répertoire ~/Desktop/foo s'il existe déjà.
  • Crée simplement le répertoire ~/Desktop/foo s'il n'existe pas déjà.

Ensuite, vous pouvez utiliser:

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

; est équivalent à une nouvelle ligne, mais vous permet d'exécuter plusieurs commandes sur une seule ligne (c'est-à-dire en tant que "commande unique").

  • Si le répertoire que vous supprimez peut contenir des fichiers en lecture seule, vous aurez besoin de l'indicateur -f pour les supprimer sans demander à l'utilisateur de manière interactive. C'est bon, mais je recommande d'être particulièrement prudent avec rm -rf .... Voir man rm pour plus de détails.
  • Vous avez besoin de la commande rm pour terminer avant l'exécution de la commande mkdir; c'est la raison pour laquelle utiliser ; au lieu de &. (Une commande précédant & s'exécute de manière asynchrone en arrière-plan.)
  • Vous avez besoin de la commande mkdir pour s'exécuter lorsque la commande rm réussit. c'est la raison pour laquelle utiliser ; au lieu de ||.
  • Vous avez besoin de la commande mkdir pour s'exécuter lorsque la commande rm échoue (généralement, une erreur signifierait que le répertoire n'existait pas déjà); c'est la raison pour laquelle utiliser ; au lieu de &&.
  • La commande rm peut échouer même si le répertoire existait déjà. Dans ce cas, la commande mkdir échouera également, mais les messages d'erreur auront un sens et il n'y aura probablement pas besoin d'ajouter une étape intermédiaire pour vérifier l'existence de foo avant d'essayer de le créer.

Voir .2.3 Listes de commandes dans le Manuel de référence Bash pour plus d'informations et d'explications sur les opérateurs ;, &, || et &&.

Comme muru a suggéré (et Rinzwind a élaboré ), je vous recommande de regarder dans rsync pour voir si cela répondra à vos besoins de sauvegarde. Il existe quelques guides utiles supplémentaires sur le page de documentation rsync , ainsi que le présent guide Ubuntu rsync .

pourquoi mkdir n'a pas cette option?

mkdir crée des répertoires (le "mk" signifie "make" ). Car supprimer également récursivement les répertoires et tous les fichiers qu’ils contiennent serait mauvais, car cela violerait le principe du moindre étonnement d’une manière qui conduirait probablement à une perte de données.

rmdir ne supprime même pas les répertoires contenant des fichiers (autres que des répertoires). rm a une option -r, ce qui est logique dans la mesure où rm supprime les fichiers (c’est son objectif; le danger inhérent est donc intuitif et les utilisateurs doivent généralement faire attention à exécuter les commandes rm.

13
Eliah Kagan

Non, il n'y a pas de commande unique pour faire ce que vous demandez.

Pourquoi?

C’est la philosophie Unix: écrire des programmes qui font une chose et le font bien. Écrire des programmes pour travailler ensemble.1

Dans ce cas, les commandes mkdir et rm font ce que vous souhaitez et fonctionnent bien ensemble, puisque rm -r supprimera également le répertoire. Par la suite, mkdir le créera.

1L'art de la programmation Unix, Eric S. Raymond citant lui-même Doug McIlroy.

6
muru

La commande permettant de supprimer un répertoire est rm. Donc, vous avez besoin de 2 commandes.

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

Comme indiqué dans les commentaires, vous pouvez les chaîner avec ; (= faire les deux même si 1st échoue) ou && (= seulement mkdir lorsque la machine n'échoue pas).

Le -r sert à supprimer des répertoires. La 1ère commande supprime également TOUT le contenu du répertoire. Si ce n'est PAS votre intention, rm et mkdir ne sont pas ce que vous recherchez: les autorisations sont chmod et chown.

pourquoi mkdir n'a pas cette option?

Ambiguïté. mkdir signifie créer un répertoire. Pas supprimer et faire répertoire. Et comme la commande rm sert à supprimer des éléments, il n’est pas nécessaire que rmdir soit capable de supprimer un répertoire.

3
Rinzwind