Ein vorhandenes Verzeichnis überschreiben?

Ein vorhandenes Verzeichnis überschreiben?

Ich habe einen Verzeichnisnamen fooin ~/Desktop. Angenommen, ich möchte von einem Terminal aus ein Verzeichnis mit demselben Namen und am selben Ort erstellen. Als ich mkdires versuchte, trat ein Fehler auf:

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

Das macht Sinn, aber ich möchte es ersetzen foo, wenn es existiert. Ich habe es durchgesehenman mkdiraber es gibt keine Möglichkeit, das zu tun.

Wie überschreibt man also fooein Verzeichnis?

Warum gibt es mkdirhierfür keine Möglichkeit?

Antwort1

Wenn Ihr Ziel darin besteht, einen einzeiligen Befehl auszuführen, der:

  • Entfernt und erstellt das Verzeichnis neu, ~/Desktop/foofalls es bereits vorhanden ist.
  • Erstellt einfach das Verzeichnis, ~/Desktop/foowenn es noch nicht existiert.

Dann können Sie verwenden:

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

;entspricht einer neuen Zeile, ermöglicht Ihnen aber die Ausführung mehrerer Befehle in einer einzigen Zeile (d. h. als „einzelner Befehl“).

  • Wenn das Verzeichnis, das Sie entfernen, schreibgeschützte Dateien enthalten kann, benötigen Sie das -fFlag, um diese zu entfernen, ohne den Benutzer interaktiv zu fragen. Das ist in Ordnung, aber ich empfehle, besonders vorsichtig zu sein rm -rf .... Sieheman rmfür Details.
  • Sie benötigen den rmBefehl, umbeendenbevor der mkdirBefehl ausgeführt wird. Aus diesem Grund sollte ;anstelle von verwendet werden &. (Ein vorhergehender Befehl &wird asynchron im Hintergrund ausgeführt.)
  • Der mkdirBefehl muss ausgeführt werden, wenn er rmerfolgreich ist. Aus diesem Grund sollten Sie ;anstelle von verwenden ||.
  • Sie müssen den mkdirBefehl ausführen, wenn er rmfehlschlägt (normalerweise bedeutet ein Fehler, dass das Verzeichnis noch nicht existierte). Aus diesem Grund sollten Sie ;anstelle von verwenden &&.
  • Der rmBefehl kann auch dann fehlschlagen, wenn das Verzeichnis bereits vorhanden ist. In diesem Fall mkdirschlägt auch der Befehl fehl. Die Fehlermeldungen sind jedoch sinnvoll und es ist wahrscheinlich nicht erforderlich, einen Zwischenschritt hinzuzufügen, der die fooExistenz von prüft, bevor versucht wird, es zu erstellen.

Sehen3.2.3 BefehlslistenimBash-Referenzhandbuchfür weitere Informationen und Erklärungen zu den Operatoren ;, &, ||, und &&.

AlsMuru hat vorgeschlagen(UndRinzwind erläuterte),Ich empfehle Ihnen, einen Blick darauf zu werfenrsyncum zu sehen, ob es Ihren Backup-Anforderungen entspricht. Es gibt einige weitere nützliche Anleitungen auf derrsync-Dokumentationsseite, sowiedieser Ubuntu rsync-Leitfaden.

warum hat mkdir diese Option nicht?

mkdirerstellt Verzeichnisse (die "mk"steht für „machen“). Auch das rekursive Löschen von Verzeichnissen und allen darin enthaltenen Dateien wäre schlecht, da es gegen diePrinzip der geringsten Überraschungauf eine Weise, die wahrscheinlich zu Datenverlust führen würde.

rmdirentfernt nicht einmal Verzeichnisse, die (keine Verzeichnis-)Dateien enthalten.rmverfügt über eine -rOption, die Sinn ergibt, da rmDateien entfernt werden sollen (das ist ihr Zweck, daher ist die inhärente Gefahr intuitiv und Benutzer wissen normalerweise, dass sie beim Ausführen von rmBefehlen vorsichtig sein müssen).

Antwort2

Nein, es gibt keinen einzelnen Befehl, um das auszuführen, worum Sie bitten.

Warum?

Das ist die Unix-Philosophie: Schreiben Sie Programme, die eine Sache tun und diese gut tun. Schreiben Sie Programme, die zusammenarbeiten. 1

In diesem Fall erledigen die Befehle mkdirund rmdas, was Sie benötigen, und arbeiten gut zusammen, da rm -rauch das Verzeichnis gelöscht wird, sodass ein nachfolgender mkdirBefehl das Verzeichnis erstellt.

1Die Kunst der Unix-Programmierung, Eric S. Raymond, der selbst Doug McIlroy zitiert.

Antwort3

Der Befehl zum Entfernen eines Verzeichnisses lautet rm: Sie benötigen also 2 Befehle.

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

Wie in den Kommentaren gezeigt, können Sie sie mit ;(= beides ausführen, auch wenn das erste fehlschlägt) oder &&(= nur mkdir, wenn rm nicht fehlschlägt) verketten.

Dies -rdient zum Entfernen von Verzeichnissen. Der 1. Befehl entfernt auch ALLE Inhalte des Verzeichnisses. Wenn dies NICHT Ihre Absicht ist, sind weder rm noch mkdir das, wonach Sie suchen: Die Berechtigungen sind chmodund chown.

warum hat mkdir diese Option nicht?

Mehrdeutigkeit. mkdirbedeutet „Verzeichnis erstellen“. Nicht „entfernen und Verzeichnis erstellen“. Und da der rmBefehl zum Löschen von Sachen ist, ist es nicht nötig, rmdirein Verzeichnis entfernen zu können.

Antwort4

Um das auf die sauberste Weise zu tun, verwende ich Folgendes:

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 
}

Und so verwenden Sie es:

create_clean_directory <dir_name>

Dadurch wird sichergestellt, dass Sie versuchen, ein Verzeichnis und keine Datei zu entfernen:

  1. -dÜberprüfen Sie, ob bereits ein Verzeichnis mit diesem Namen vorhanden ist. Wenn ja, löschen Sie es.

  2. -fÜberprüfen Sie, dass keine Datei mit diesem Namen existiert. Wenn ja, drucken Sie die Fehlermeldung und beenden Sie das Programm.

  3. Erstellen Sie das neue Verzeichnis und geben Sie eine Erfolgsmeldung aus. Wenn die Meldung fehlgeschlagen ist, geben Sie eine Meldung mit dem Hinweis „Echo fehlgeschlagen“ aus.

verwandte Informationen