Angenommen, Sie haben list.txt
so:
file 1
file 2
file 3
Sie können erreichen, was Sie wollen mit:
while read FILE; do touch "${FILE} some string"; done < list.txt
Sie haben also eine Datei list
die enthält:
this
that
the-other
und Sie möchten für jede Zeile in dieser Datei eine Datei mit dem in dieser Zeile angegebenen Namen erstellen. Das ist ziemlich einfach – genau dann, wenn jede Zeile nur aus einem einzigen Wort besteht:
cat list | xargs touch --
(Die --
sagt touch
nicht zu versuchen, irgendetwas danach als Argument zu analysieren; ohne es, wenn Sie Dateinamen wie -this
haben , die führende -
wird touch verwechseln und denken, dass 't', 'h', 'i' und 's' als Argumente gemeint sind und nicht als Teile des wörtlichen Dateinamens, der berührt werden soll.)
Das ist der einfache Fall, um den man sich gekümmert hat, aber es ist nicht das, wonach Sie gefragt haben; wenn Sie möchten, dass der Dateiname Text enthält, der über das hinausgeht, was in den Zeilen in list
angegeben ist , werden die Dinge komplizierter; xargs kann diese Art von Interpolation nicht durchführen. Stattdessen benötigen Sie etwas wie das Folgende (was voraussetzt, dass Ihre Shell bash
ist , wie es auf den meisten Systemen Standard ist):
for file in `cat list`; do touch -- $file-customtext; done
Beachten Sie, dass dies immer noch nur funktioniert, wenn jede Zeile nur aus einem einzigen Wort besteht. In diesem Befehl $file
wird durch den Dateinamen ersetzt, der in einer bestimmten Zeile in list
angegeben ist; alles drumherum wird wörtlich genommen, also dieser Befehl mit dem list
Obiger Inhalt würde die folgenden Dateien erstellen:
this-customtext
that-customtext
the-other-customtext
Sie können '-customtext' natürlich beliebig ersetzen, und Sie können sowohl ein Präfix als auch ein Suffix verwenden; wenn Sie stattdessen do touch -- some-$file-text
hätten , zum Beispiel würde es genauso gut funktionieren und zu Dateien mit dem Namen some-this-text
führen &c.
Nehmen wir nun den Inhalt von list
an sind nicht so einfach -- insbesondere, dass sie Leerzeichen, Nicht-Wort-Zeichen oder andere Dinge enthalten, die die Shell nicht richtig interpretieren wird. Wenn Sie drei Personen fragen, was sie in diesem Fall empfehlen würden, erhalten Sie wahrscheinlich fünf Antworten; Ich bin ein Perl-Hacker, also ist meine Antwort Perl. Nehmen wir konkret einen list
an das enthält:
This is the first line
of three (three?) lines
in the list file.
Die Art und Weise, wie ich dies tun würde, wäre:
cat list | perl -ne'chomp; system(qq|touch -- "custom $_ text"|)'
Was die resultierenden Dateien erzeugt:
custom This is the first line text
custom of three (three?) lines text
custom in the list file. text
Der benutzerdefinierte Text kann in diesem Fall beliebig sein, Leerzeichen und so weiter, solange er weder "
enthält (was touch
verwirren wird ) noch '
(was perl
verwirren wird ); im Perl-Befehl $_
stellt den Inhalt einer gegebenen Zeile von list
dar , und benutzerdefinierter Text gehört entweder davor oder danach, aber innerhalb der doppelten Anführungszeichen. (Benutzerdefinierter Text außerhalb der doppelten Anführungszeichen wird von touch
berücksichtigt als separater Dateiname, der buchstäblich erstellt wird, es sei denn, er enthält etwas, das touch
verursacht Fehler aus.)