Ich habe so etwas:
% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/
Ich möchte ein Verzeichnis bar
unter jedem der Unterverzeichnisse unter erstellen foo
.
Wenn ich das versuche mit
% mkdir -p /tmp/foo/*/bar
... Ich bekomme den Fehler
zsh: no matches found: /tmp/foo/*/bar
(Im Nachhinein kann ich den Grund für den Fehler verstehen.)
Ich weiß, dass ich das ursprüngliche Problem mit einer for-Schleife lösen kann, aber ich bin gespannt, ob zsh
eine Form der Parametererweiterung unterstützt wird, die das gewünschte Argument für einen einzelnen Aufruf von erzeugt mkdir -p
. IOW, eine Parametererweiterung, die " /bar
an jedes durch Erweitern erzeugte Präfix anhängen /tmp/foo/*
" entspricht
% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar
mkdir -p
, was sich geringfügig von Ihrem Befehl unterscheidet, keine Fehler auszulösen, wenn einige dieser Verzeichnisse bereitsbar
Unterverzeichnisse haben. Kleiner Punkt, aber hier erwähnenswert. :)${^spec}
undbar
an jedes Element anzuhängen, auf das/tmp/foo/*(/)
erweitert wird:set -- /tmp/foo/*(/)
thenmkdir -p -- "${^@}/bar"
Sicher - benutze eine Schleife
Globs werden verwendet, um Listen vorhandener Elemente zu erweitern , nicht Dinge, die noch nicht erstellt wurden.
quelle
zsh
Globs erweitert und Text mit einer einzigen Syntax angehängt werden kann - aber ich denke, es ist wahrscheinlich die einzige Möglichkeit, das zu tun, was Sie wollen, @kjo.Wenn sich die Verzeichnisse in einem Array befinden, können Sie die
${^...}
Form der Erweiterung verwenden.quelle
Sie können es verwenden
find
undxargs
tun:die Verwendung
-maxdepth 1
und-mindepth 1
Verhinderung der Erstellung vonbar
Unterverzeichnissen von Zielen bzw. an/tmp/foo
sich.type d
Lässt es nur Verzeichnisse berücksichtigen.Sie müssen entfernen
echo
, um tatsächliche Aktionenecho
auszuführen. Andernfalls werden nur die auszuführenden Zeilen ausgedruckt. Sie können es auch in eine Substitution einschließen$()
, um es auszuführen.Handbuch sagt
xargs -i
ist veraltet, aber ich fand keine andere ebenso praktische Alternative, so sollte es immer noch Arbeit seit einigen Jahren ... Sie können ersetzen-i
mit-I'{}'
zu up-to-date mit dem.quelle
@loa_in_ hatte das meiste davon, aber die Piping-
find
Ausgabe ist in der Regel ein Fauxpas.quelle
xargs
verschiedene Tools, die keine-exec
Alternative haben, also verwende ich meinen Ansatz, da er mit allen gleichermaßen funktioniert.