Ich habe einen Verzeichnisnamen foo
in ~/Desktop
. Angenommen, ich möchte von einem Terminal aus ein Verzeichnis mit demselben Namen und am selben Ort erstellen. Als ich mkdir
es 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 mkdir
aber es gibt keine Möglichkeit, das zu tun.
Wie überschreibt man also foo
ein Verzeichnis?
Warum gibt es mkdir
hierfür keine Möglichkeit?
Antwort1
Wenn Ihr Ziel darin besteht, einen einzeiligen Befehl auszuführen, der:
- Entfernt und erstellt das Verzeichnis neu,
~/Desktop/foo
falls es bereits vorhanden ist. - Erstellt einfach das Verzeichnis,
~/Desktop/foo
wenn 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
-f
Flag, um diese zu entfernen, ohne den Benutzer interaktiv zu fragen. Das ist in Ordnung, aber ich empfehle, besonders vorsichtig zu seinrm -rf ...
. Sieheman rm
für Details. - Sie benötigen den
rm
Befehl, umbeendenbevor dermkdir
Befehl ausgeführt wird. Aus diesem Grund sollte;
anstelle von verwendet werden&
. (Ein vorhergehender Befehl&
wird asynchron im Hintergrund ausgeführt.) - Der
mkdir
Befehl muss ausgeführt werden, wenn errm
erfolgreich ist. Aus diesem Grund sollten Sie;
anstelle von verwenden||
. - Sie müssen den
mkdir
Befehl ausführen, wenn errm
fehlschlägt (normalerweise bedeutet ein Fehler, dass das Verzeichnis noch nicht existierte). Aus diesem Grund sollten Sie;
anstelle von verwenden&&
. - Der
rm
Befehl kann auch dann fehlschlagen, wenn das Verzeichnis bereits vorhanden ist. In diesem Fallmkdir
schlägt auch der Befehl fehl. Die Fehlermeldungen sind jedoch sinnvoll und es ist wahrscheinlich nicht erforderlich, einen Zwischenschritt hinzuzufügen, der diefoo
Existenz 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 werfenrsync
um 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?
mkdir
erstellt 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.
rmdir
entfernt nicht einmal Verzeichnisse, die (keine Verzeichnis-)Dateien enthalten.rm
verfügt über eine -r
Option, die Sinn ergibt, da rm
Dateien entfernt werden sollen (das ist ihr Zweck, daher ist die inhärente Gefahr intuitiv und Benutzer wissen normalerweise, dass sie beim Ausführen von rm
Befehlen 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 mkdir
und rm
das, was Sie benötigen, und arbeiten gut zusammen, da rm -r
auch das Verzeichnis gelöscht wird, sodass ein nachfolgender mkdir
Befehl 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 -r
dient 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 chmod
und chown
.
warum hat mkdir diese Option nicht?
Mehrdeutigkeit. mkdir
bedeutet „Verzeichnis erstellen“. Nicht „entfernen und Verzeichnis erstellen“. Und da der rm
Befehl zum Löschen von Sachen ist, ist es nicht nötig, rmdir
ein 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:
-d
Überprüfen Sie, ob bereits ein Verzeichnis mit diesem Namen vorhanden ist. Wenn ja, löschen Sie es.-f
Überprüfen Sie, dass keine Datei mit diesem Namen existiert. Wenn ja, drucken Sie die Fehlermeldung und beenden Sie das Programm.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.