GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So erstellen Sie unter Linux Dateien, die nach Zeilen in einer Textdatei benannt sind

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


Linux
  1. So erstellen Sie einen Swap unter Linux

  2. So erstellen Sie Sparse-Dateien in Linux mit dem Befehl „dd“.

  3. Wie erstelle ich eine Liste eindeutiger Zeilen in einer Textdatei mit einem Linux-Shell-Skript?

  4. Wie liste ich Dateien mit vollständigen Pfaden in Linux auf?

  5. Wie zeigt man bestimmte Zeilen aus einer Textdatei in Linux an?

So benennen Sie eine Datei (en) in Linux um

So erstellen Sie Verzeichnisse aus einer Textdatei unter Linux

So drucken Sie doppelte Zeilen in einer Textdatei unter Linux

So finden Sie Dateien, die eine bestimmte Textzeichenfolge in Linux enthalten

So komprimieren Sie eine Datei unter Linux

So erstellen Sie eine passwortgeschützte Zip-Datei oder Verzeichnisse in Linux