Ich weiß, dass Sie mkdir
ein Verzeichnis und touch
eine Datei erstellen können, aber gibt es keine Möglichkeit, beide Vorgänge gleichzeitig auszuführen?
dh wenn ich das Folgende tun möchte, wenn der Ordner other
nicht existiert:
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
Error:
cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory
Hat jemand eine Funktion als Problemumgehung dafür gefunden?
Antworten:
Verwenden Sie
&&
diese Option , um zwei Befehle in einer Shell-Zeile zu kombinieren:Hinweis: Bisher habe ich empfohlen Nutzung
;
der beiden Befehle zu trennen , aber wie durch @trysis wies darauf hin , es ist wahrscheinlich besser, den Einsatz&&
in den meisten Fällen , weil in dem FallCOMMAND1
versagtCOMMAND2
wird auch nicht ausgeführt werden. (Andernfalls kann dies zu Problemen führen, die Sie möglicherweise nicht erwartet haben.)quelle
&&
, da;
der zweite Befehl weiterhin ausgeführt wird, wenn der erste Befehl fehlschlägt (und auch fehlschlägt, da dieses Verzeichnis noch nicht vorhanden ist). Mit&&
wenn der erste Befehl fehlschlägt, wird der zweite Befehl nicht ausgeführt.mkdir -p /my/other/path/here && touch $_/cpredthing.txt
. Das$_
erweitert sich im Wesentlichen auf das "letzte Argument im zuletzt ausgeführten Befehl".touch
einen-p
Parameter wiemkdir
diesen genommen.Sie müssen zuerst alle übergeordneten Verzeichnisse erstellen.
Wenn Sie kreativ werden möchten, können Sie eine Funktion erstellen :
Und dann verwenden Sie es wie jeden anderen Befehl:
quelle
&&
- Wie ist das?supertouch "/tmp/abc/def ghi/jkl mno.txt"
und es ist fehlgeschlagen. Alle Befehledirname
,mkdir
undtouch
gab erros.mktouch
es ist.Mach es mit / usr / bin / install:
Wenn Sie keine Quelldatei haben:
quelle
-D /dev/null
, was für mich leichter zu merken ist.Das würde ich tun:
mkdir -p /my/other/path/here && touch $_/cpredthing.txt
Hier ist das
$_
eine Variable, die das letzte Argument für den vorherigen Befehl darstellt, den wir in Zeile ausgeführt haben.Wie immer, wenn Sie sehen möchten, wie die Ausgabe
echo
aussehen könnte, können Sie sie mit dem folgenden Befehl testen :echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
Welche Ausgaben als:
Als Bonus können Sie mit der Klammererweiterung mehrere Dateien gleichzeitig schreiben, zum Beispiel:
Wieder völlig testbar mit
echo
:quelle
quelle
dirname -z "$@" | xargs -0 mkdir -p
stattdessen aus Gründen der Leistung zu verwenden. (Hör auf zu lauern undSie können dies in zwei Schritten tun:
quelle
quelle
Wie ich in einem Unix-Forum gesehen und getestet habe, löst dies das Problem
quelle
Keine Notwendigkeit für
if then
Anweisungen ... Sie können dies in einer einzelnen Zeile tun;
- oder in zwei Zeilen -
- Der
-p
verhindert, dass ein Fehler zurückkehrt, wenn das Verzeichnis bereits vorhanden ist (was ich hier gesucht habe :))quelle
In dem speziellen (aber nicht ungewöhnlichen) Fall, in dem Sie versuchen, dieselbe Verzeichnishierarchie wiederherzustellen,
cp --parents
kann dies hilfreich sein.Wenn Sie beispielsweise
/my/long
die Quelldateien enthalten undmy/other
bereits vorhanden sind, können Sie Folgendes tun:quelle
Wenn Sie einfach mit nur 1 Parameter-Snippet wollen:
quelle
rm -rf
Befehle herum . - † Das heißt, Stunden , vorausgesetzt, Sie halten sich an eine vernünftige Versionskontroll- / Sicherungsrichtlinie ... andernfalls kann es durchaus Monate dauern .rm -rf
sollte niemals ohne angemessene Erklärung und Warnungen vorgeschlagen werden.