Supponi di avere list.txt
come questo:
file 1
file 2
file 3
Puoi ottenere ciò che desideri con:
while read FILE; do touch "${FILE} some string"; done < list.txt
Quindi hai un file list
che contiene:
this
that
the-other
e vuoi creare, per ogni riga in quel file, un file con il nome dato su quella riga. È abbastanza facile – se e solo se ogni riga consiste solo di una singola parola:
cat list | xargs touch --
(Il --
dice a touch
non cercare di analizzare nulla dopo di esso come argomento; senza di esso, se hai nomi di file come -this
, il -
iniziale confonderà touch pensando che 't', 'h', 'i' e 's' siano intesi come argomenti, piuttosto che parti del nome file letterale da toccare.)
Questo è il semplice caso curato, ma non è quello che hai chiesto; se vuoi che il nome del file contenga del testo oltre a quanto specificato nelle righe in list
, le cose si complicano; xargs non può eseguire quel tipo di interpolazione. Invece, avresti bisogno di qualcosa di simile al seguente (che richiede che la tua shell sia bash
, come è standard sulla maggior parte dei sistemi):
for file in `cat list`; do touch -- $file-customtext; done
Attenzione che funziona ancora solo se ogni riga è composta da una sola parola. In questo comando, $file
è sostituito dal nome del file specificato su una determinata riga in list
; tutto ciò che lo circonda è preso alla lettera, quindi questo comando con list
i contenuti sopra creerebbero i seguenti file:
this-customtext
that-customtext
the-other-customtext
Puoi sostituire '-customtext' con quello che vuoi, ovviamente, e puoi anche avere un prefisso oltre che un suffisso; se invece avessi do touch -- some-$file-text
, ad esempio, funzionerebbe altrettanto bene e genererebbe file denominati some-this-text
&c.
Ora, quindi, supponendo il contenuto di list
non sono così semplici, in particolare perché contengono spazi, caratteri non di parole o altre cose che la shell non interpreterà correttamente. Se chiedi a tre persone cosa consiglierebbero in questo caso, probabilmente otterresti cinque risposte; Sono un hacker Perl, quindi la mia risposta è Perl. Nello specifico, supponiamo un list
che contiene:
This is the first line
of three (three?) lines
in the list file.
Il modo in cui lo farei sarebbe:
cat list | perl -ne'chomp; system(qq|touch -- "custom $_ text"|)'
Che produce i file risultanti:
custom This is the first line text
custom of three (three?) lines text
custom in the list file. text
Il testo personalizzato in questo caso può essere quello che vuoi, spazi e tutto, purché non contenga né "
(che confonderà touch
) né '
(che confonderà perl
); nel comando Perl, $_
rappresenta il contenuto di una data riga da list
e il testo personalizzato deve trovarsi prima o dopo di esso, ma tra virgolette doppie. (Il testo personalizzato al di fuori delle virgolette doppie sarà considerato da touch
come nome file separato, che verrà letteralmente creato a meno che non contenga qualcosa che causerà touch
per errore.)