Ich weiß, dass Sie mkdir
ausführen können, um ein Verzeichnis zu erstellen, und touch
, um eine Datei zu erstellen, aber gibt es keine Möglichkeit, beide Vorgänge auf einmal auszuführen?
d. h., wenn ich Folgendes tun möchte, wenn der Ordner other
nicht vorhanden ist:
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 Möglichkeit gefunden, dies zu umgehen?
Verwenden Sie &&
, Um zwei Befehle in einer Shell-Zeile zu kombinieren:
COMMAND1 && COMMAND2
mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt
Hinweis: Früher habe ich die Verwendung von ;
Empfohlen, um die beiden Befehle zu trennen, aber wie durch @trysis hervorgehoben, ist es wahrscheinlich besser, &&
In den meisten Situationen zu verwenden, da im Fall COMMAND1
Fehlschlägt COMMAND2
Wird ebenfalls nicht ausgeführt. (Andernfalls kann dies zu Problemen führen, mit denen Sie möglicherweise nicht gerechnet haben.)
Sie müssen zuerst alle übergeordneten Verzeichnisse erstellen.
FILE=./base/data/sounds/effects/camera_click.ogg
mkdir -p "$(dirname "$FILE")" && touch "$FILE"
Wenn Sie kreativ werden möchten, können Sie eine Funktion erstellen :
mktouch() {
if [ $# -lt 1 ]; then
echo "Missing argument";
return 1;
fi
for f in "[email protected]"; do
mkdir -p -- "$(dirname -- "$f")"
touch -- "$f"
done
}
Und dann benutze es wie jeden anderen Befehl:
mktouch ./base/data/sounds/effects/camera_click.ogg ./some/other/file
Mach es mit/usr/bin/install:
install -D /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
wenn Sie keine Quelldatei haben:
install -D <(echo 1) /my/other/path/here/cpedthing.txt
Das würde ich tun:
mkdir -p /my/other/path/here && touch $_/cpredthing.txt
Hier das $_
ist eine Variable, die das letzte Argument zum vorherigen Befehl darstellt, den wir in Zeile ausgeführt haben.
Wie immer, wenn Sie sehen möchten, wie die Ausgabe aussehen könnte, können Sie sie mit dem Befehl echo
wie folgt testen:
echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
Welche Ausgaben als:
mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt
Als Bonus können Sie mit der geschweiften Klammer mehrere Dateien gleichzeitig schreiben, zum Beispiel:
mkdir -p /code/temp/other/path/here &&
touch $_/{cpredthing.txt,anotherfile,somescript.sh}
Wiederum mit echo
vollständig testbar:
mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt /code/temp/other/path/here/anotherfile /code/temp/other/path/here/somescript.sh
sie können es in zwei Schritten tun:
mkdir -p /my/other/path/here/
touch /my/other/path/here/cpedthing.txt
#!/bin/sh
for f in "[email protected]"; do mkdir -p "$(dirname "$f")"; done
touch "[email protected]"
wie ich in einem unix forum gesehen und getestet habe löst dies das problem
ptouch() {
for p in "[email protected]"; do
_dir="$(dirname -- "$p")"
[ -d "$_dir" ] || mkdir -p -- "$_dir"
touch -- "$p"
done
}
if [ ! -d /my/other ]
then
mkdir /my/other/path/here
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
fi
kein Bedarf für if then
Statements ... du kannst es in einer einzigen Zeile machen usign ;
mkdir -p /my/other/path/here;cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
- oder in zwei Zeilen -
mkdir -p /my/other/path/here
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
-- das -p
verhindert, dass Fehler zurückgegeben werden, wenn das Verzeichnis bereits existiert (nach was ich hier gesucht habe :))
In dem speziellen (aber nicht seltenen) Fall, in dem Sie versuchen, dieselbe Verzeichnishierarchie wiederherzustellen, wird cp --parents
kann nützlich sein.
Zum Beispiel wenn /my/long
enthält die Quelldateien und my/other
existiert bereits, Sie können dies tun:
cd /my/long
cp --parents path/here/thing.txt /my/other