Es ist möglich, es zu "fälschen".
Erstens einige erforderliche Theorie:
Rob Griffiths veröffentlichte 2007 einen Artikel mit dem Titel " Einfach viele neue Ordner erstellen" auf Macworld.com, in dem er die Verwendung des xargs
Befehls zum Einlesen einer Liste von Dateien zum Erstellen von Verzeichnissen mit erläuterte mkdir
.
xargs
kann auf ein placeholder
( {}
) mit dem -I
Flag verweisen , das den Wert für jedes Argument enthält, an das übergeben wird xargs
. Hier ist der Unterschied zwischen mit dieser Flagge und ohne:
$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt
xargs
kann auch beliebige Shell-Befehle mit dem sh -c
Flag ausführen :
foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'
Die Konzepte kombinieren:
Wir können diese Konzepte mit und mkdir -p
anstelle des mkdir
Konzepts in @ldx 's Antwort kombinieren , um Folgendes zu erzeugen:
$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
Dieser Befehl ordnet grundsätzlich jeden Dateinamen in einer zeilengetrennten Liste von Dateien zu, schneidet den Dateiteil ab, erstellt die Verzeichnisse mit mkdir -p
und es dann touch
den Dateinamen in seinem jeweiligen Verzeichnis.
Hier ist eine Aufschlüsselung dessen, was im obigen Befehl passiert:
Sagen Sie zum Beispiel, dass mein files.txt
Aussehen so ist:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
cat files.txt
produziert deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
deeply/nested/foo/bar.js
deeply/nested/baz/fiz.txt
wird zu geleitet xargs
- da wir verwendet haben
-I {}
, xargs
wird jedes Argument in einen eigenen Befehl übersetzt, so dass wir jetzt haben:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
- Anschließend führen wir einen Shell-Befehl aus, der den
&&
Kombinator verwendet, um 3 Befehle zu gruppieren, die nacheinander ausgeführt werden. Der erste Befehl speichert die Datei in einer Umgebungsvariablen (die beim nächsten Dateidurchlauf wiederverwendet wird) und verwendet dabei den zuvor registrierten Platzhalter haben:
f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
- Wir haben jetzt eine Variable, an die wir übergeben können
mkdir -p
, aber wir müssen den Dateinamen ausschneiden. Einfach genug mit '${f%/*}'
:
mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
- und dann referenzieren wir die
f
Variable einfach in ihrer Gesamtheit neu, wenn wir touch
:
touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt