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 xargsBefehls zum Einlesen einer Liste von Dateien zum Erstellen von Verzeichnissen mit erläuterte mkdir.
xargskann auf ein placeholder( {}) mit dem -IFlag 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
xargskann auch beliebige Shell-Befehle mit dem sh -cFlag ausführen :
foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'
Die Konzepte kombinieren:
Wir können diese Konzepte mit und mkdir -panstelle des mkdirKonzepts 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 -pund es dann touchden Dateinamen in seinem jeweiligen Verzeichnis.
Hier ist eine Aufschlüsselung dessen, was im obigen Befehl passiert:
Sagen Sie zum Beispiel, dass mein files.txtAussehen 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 {}, xargswird 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
fVariable einfach in ihrer Gesamtheit neu, wenn wir touch:
touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt