it-swarm.com.de

Bestehendes Verzeichnis überschreiben?

Ich habe einen Verzeichnisnamen foo in _~/Desktop_. Angenommen, ich möchte ein Verzeichnis von einem Terminal mit demselben Namen und demselben Speicherort aus erstellen. Als ich mkdir ausprobierte, gab es einen Fehler:

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

Das macht Sinn, aber ich möchte foo ersetzen, falls vorhanden. Ich habe man mkdir durchgesehen, aber es gibt keine Option, die das macht.

Wie kann man also das Verzeichnis foo überschreiben?

Warum hat mkdir keine Option dazu?

8
nux

Wenn Sie einen einzeiligen Befehl ausführen möchten, gilt Folgendes:

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

Dann können Sie verwenden:

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

; entspricht einer neuen Zeile, aber Sie können mehrere Befehle in einer einzelnen Zeile ausführen (d. H. Als "einzelner Befehl").

  • Wenn das zu entfernende Verzeichnis möglicherweise schreibgeschützte Dateien enthält, benötigen Sie das Flag -f, um diese zu entfernen, ohne den Benutzer interaktiv aufzufordern. Das ist in Ordnung, aber ich empfehle, mit rm -rf ... besonders vorsichtig zu sein. Siehe [SOMECODE] für Details.
  • Sie benötigen den Befehl rm, um zu beenden , bevor der Befehl mkdir ausgeführt wird. Aus diesem Grund wird man rm anstelle von ; verwendet. (Ein Befehl vor & wird asynchron im Hintergrund ausgeführt.)
  • Sie müssen den Befehl mkdir ausführen, wenn der Befehl rm erfolgreich ausgeführt wurde. Aus diesem Grund wird & anstelle von ; verwendet.
  • Sie müssen den Befehl mkdir ausführen, wenn der Befehl rm fehlschlägt (normalerweise bedeutet ein Fehlschlag, dass das Verzeichnis noch nicht vorhanden ist). Aus diesem Grund wird || anstelle von ; verwendet.
  • Der Befehl rm schlägt möglicherweise auch dann fehl, wenn das Verzeichnis bereits vorhanden ist. In diesem Fall schlägt der Befehl mkdir ebenfalls fehl. Die Fehlermeldungen sind jedoch sinnvoll und es ist wahrscheinlich nicht erforderlich, einen Zwischenschritt hinzuzufügen, um die Existenz von foo zu überprüfen, bevor Sie versuchen, sie zu erstellen.

Weitere Informationen und Erläuterungen zu &&, ;, &, || finden Sie unter .2.3 Befehlslisten im Bash-Referenzhandbuch . und && Operatoren.

Als von muru vorgeschlagen (und von Rinzwind ausgearbeitet ), empfehle ich dir rsync um zu sehen, ob es Ihren Backup-Anforderungen entspricht. Auf der Seite rsync documentation page sowie this Ubuntu rsync guide finden Sie einige zusätzliche nützliche Anleitungen.

warum hat mkdir diese option nicht?

mkdir erstellt Verzeichnisse (das "mk" steht für "make" ). Auch das rekursive Löschen von Verzeichnissen und allen darin enthaltenen Dateien wäre schlecht, da dies das Prinzip des geringsten Erstaunens in einer Weise verletzen würde, die wahrscheinlich zu Datenverlust führen würde.

rmdir entfernt nicht einmal Verzeichnisse, in denen sich Dateien (die keine Verzeichnisdateien sind) befinden. rm hat eine -r -Option, die sinnvoll ist, da erwartet wird, dass rm Dateien entfernt (dies ist der Zweck, daher ist die inhärente Gefahr intuitiv und Benutzer wissen normalerweise, dass sie vorsichtig sind, wenn sie rm-Befehle ausführen ).

14
Eliah Kagan

Nein, es gibt keinen einzigen Befehl, um das zu tun, wonach Sie fragen.

Warum?

Dies ist die Unix-Philosophie: Schreiben Sie Programme, die eines können und es gut machen. Schreiben Sie Programme, um zusammenzuarbeiten.1

In diesem Fall tun die Befehle mkdir und rm das, was Sie benötigen, und arbeiten gut zusammen, da rm -r auch das Verzeichnis löscht, sodass ein nachfolgendes mkdir erstellt wird das Verzeichnis.

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

6
muru

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 tun, auch wenn der 1. fehlschlägt) oder && (= nur mkdir, wenn der rm nicht fehlschlägt) verketten.

Der -r dient zum Entfernen von Verzeichnissen. Der 1. Befehl entfernt auch ALLE Inhalte des Verzeichnisses. Wenn dies NICHT Ihre Absicht ist, sind sowohl rm als auch mkdir nicht das, wonach Sie suchen: Die Berechtigungen sind chmod und chown.

warum hat mkdir diese option nicht?

Mehrdeutigkeit. mkdir steht für make directory. Nicht entfernen und Verzeichnis erstellen. Und da der Befehl rm zum Löschen von Dingen dient, muss rmdir nicht in der Lage sein, ein Verzeichnis zu entfernen.

3
Rinzwind

Um das auf die sauberste Art und Weise zu machen, benutze 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 um es zu benutzen:

create_clean_directory <dir_name>

Dies stellt sicher, dass das, was Sie entfernen möchten, ein Verzeichnis und keine Datei ist:

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

  2. -f Vergewissern Sie sich, dass keine Datei mit diesem Namen vorhanden ist. Wenn ja, Fehlermeldung drucken und beenden.

  3. Erstellen Sie das neue Verzeichnis, und geben Sie Erfolgsmeldungen aus. Wenn dies fehlschlägt, ist das Echo fehlgeschlagen.

1
Rea Haas