Remplacer un répertoire existant?

11

J'ai un nom de répertoire foositué dans ~/Desktop. Supposons que je veuille créer un répertoire à partir d'un terminal portant le même nom et au même emplacement. Quand j'ai essayé, mkdircela a donné une erreur:

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

C'est logique, mais je veux remplacer foos'il existe. J'ai regardé à travers, man mkdirmais il n'y a aucune option pour faire ça.

Alors, comment écraser le foorépertoire?

Pourquoi n'a pas mkdird'option pour le faire?

nux
la source
Remplacer foocomme pour en supprimer tout le contenu? mkdira une -poption qui ignore si le répertoire existe.
muru
4
Donc, vous voulez une commande qui supprimera tous les fichiers d'un répertoire lorsque vous créez accidentellement un nouveau répertoire avec le même nom? Et vous vous demandez pourquoi ce n'est pas une option? Est-ce une farce?
Marty Fried
les downvoters expliquent simplement pourquoi, je demande une commande qui supprime un répertoire existant
nux
1
@nux pour moi, la question n'a aucun sens ... expliquez pourquoi vous souhaitez supprimer et recréer un répertoire. Nous avons des commandes pour tout ce que vous devez faire dans le répertoire. mkdir n'a pas besoin d'une option pour supprimer / recréer.
Rinzwind
1
est-ce un crime ici si je pose une question logique !!
nux

Réponses:

21

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

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

Ensuite, vous pouvez utiliser:

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

; est équivalent à un saut de ligne, mais il vous permet d'exécuter plusieurs commandes sur une seule ligne (c'est-à-dire comme une "commande unique").

  • Si le répertoire que vous supprimez peut contenir des fichiers en lecture seule, vous aurez besoin de l' -findicateur pour les supprimer sans inviter l'utilisateur de manière interactive. C'est correct, mais je recommande d'être particulièrement prudent avec rm -rf .... Voir man rmpour plus de détails.
  • Vous avez besoin de la rmcommande pour terminer avant la mkdircommande est exécutée; c'est la raison d'utiliser ;au lieu de &. (Une commande précédente &s'exécute de manière asynchrone en arrière-plan.)
  • Vous devez mkdirexécuter la rmcommande lorsque la commande réussit; c'est la raison d'utiliser ;au lieu de ||.
  • Vous devez mkdirexécuter la rmcommande lorsque la commande échoue (généralement, l'échec signifie que le répertoire n'existait pas déjà); c'est la raison d'utiliser ;au lieu de &&.
  • La rmcommande peut échouer même lorsque le répertoire existait déjà, auquel cas la mkdircommande échouera également, mais les messages d'erreur auront un sens et il n'est probablement pas nécessaire d'ajouter une étape intermédiaire pour vérifier fool'existence avant d'essayer de le créer.

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

Comme Muru l'a suggéré (et Rinzwind a élaboré ), je vous recommandersync de vérifier si cela répondra à vos besoins de sauvegarde. Il existe d'autres guides utiles sur la page de documentation rsync , ainsi que ce guide Ubuntu rsync .

pourquoi mkdir n'a pas cette option?

mkdircrée des répertoires (le "mk" signifie "make" ). Il serait également mauvais de supprimer récursivement les répertoires et tous les fichiers qu'ils contiennent, car cela violerait le principe du moindre étonnement d'une manière qui entraînerait probablement une perte de données.

rmdirne supprime même pas les répertoires contenant des fichiers (autres que des répertoires). rma une -roption, ce qui est logique car il rmest censé supprimer des fichiers (c'est son objectif, donc le danger inhérent est intuitif et les utilisateurs savent généralement être prudents lorsqu'ils exécutent des rmcommandes).

Eliah Kagan
la source
+1 excellent. Cette réponse va au-delà de l'explication de la syntaxe, quelque chose que je souhaite être plus profond sur les sites stackexchange. Il y a beaucoup de pépites d'or dans cette réponse.
Govind Rai
7

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. Écrivez des programmes pour travailler ensemble. 1

Dans ce cas, les commandes mkdiret rmfont ce dont vous avez besoin et fonctionnent bien ensemble, car rm -relles suppriment également le répertoire, de sorte qu'une mkdircréation ultérieure crée le répertoire.

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

muru
la source
pour l'instant, c'est une bonne réponse, je vais chercher ça
nux
3

La commande pour supprimer un répertoire est rm. Vous avez donc besoin de 2 commandes.

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

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

C'est -rpour supprimer les répertoires. La 1ère commande supprime également TOUS les contenus du répertoire. Si ce n'est PAS votre intention, rm et mkdir ne sont pas ce que vous recherchez: les autorisations sont chmodet chown.

pourquoi mkdir n'a pas cette option?

Ambiguïté. mkdirsignifie créer un répertoire. Pas supprimer et créer un répertoire. Et comme la rmcommande sert à supprimer des éléments, il n'est pas nécessaire de rmdirpouvoir supprimer un répertoire.

Rinzwind
la source
je le sais, mais je veux dire une commande, vous pouvez voir mon montage je le change
nux
Expliquez d'abord pourquoi vous devez recréer le répertoire. Cela n'a aucun sens pour moi.
Rinzwind
est mon besoin logique, je me demande juste comment? ça a du sens pour moi :)
nux
@nux non, ce n'est pas le cas. Et le responsable de mkdir ne comprend pas non plus pourquoi;) Ce que vous voulez est inutile et n'a aucun mérite.
Rinzwind
ok si vous voulez savoir que je fais un script pour faire une sauvegarde dans un nouveau répertoire avec le même nom de foo et permet de le remplacer s'il existe pour réduire l'espace
nux
1

Pour le faire de la manière la plus propre, j'utilise ceci:

create_clean_directory(){
    dir_name=$1
    if [ -d "$dir_name" ]; then
        echo "Removing $dir_name"
        rm -rf "$dir_name"
    elif [ -f "$dir_name" ]; then
        echo "File with this name already exists, not a directory."
        exit
    fi
    if mkdir "$dir_name"; then
        echo "Clean directory created: $dir_name"
        return 0
    else
        echo "Creating directory failed: $dir_name"
        return 1
    fi 
}

Et pour l'utiliser:

create_clean_directory <dir_name>

Cela garantit que ce que vous essayez de supprimer est un répertoire et non un fichier:

  1. -dVérifiez si un répertoire portant ce nom existe déjà. si oui, supprimez-le.

  2. -fVérifiez qu'aucun fichier portant ce nom n'existe. si c'est le cas, imprimez le message d'erreur et quittez.

  3. Créez le nouveau répertoire et la réussite de l'écho, ou en cas d'échec, l'écho a échoué.

Rea Haas
la source