it-swarm.com.de

Unix - Pfad von Ordnern und Dateien erstellen

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?

116
toop

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.)

128
evotopid

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
75

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
20
Ivan Dives

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
12
Sgnl

sie können es in zwei Schritten tun:

mkdir -p /my/other/path/here/
touch /my/other/path/here/cpedthing.txt
12
Jörg Beyer
#!/bin/sh
for f in "[email protected]"; do mkdir -p "$(dirname "$f")"; done
touch "[email protected]"
12
Javier

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
}
2
Fabian Rios
if [ ! -d /my/other ]
then
   mkdir /my/other/path/here
   cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
fi
2
Barun Parichha

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 :))

1
tediffer3rd

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
1
Todd Owen