Řekněme, že máte list.txt
takhle:
file 1
file 2
file 3
Můžete dosáhnout toho, co chcete, s:
while read FILE; do touch "${FILE} some string"; done < list.txt
Takže máte soubor list
který obsahuje:
this
that
the-other
a chcete vytvořit pro každý řádek v tomto souboru soubor s názvem uvedeným na tomto řádku. To je docela snadné – tehdy a jen tehdy, když se každý řádek skládá pouze z jediného slova:
cat list | xargs touch --
(--
říká touch
nesnažit se po něm nic analyzovat jako argument; bez něj, pokud máte názvy souborů jako -this
, první -
zamění dotek tak, že si bude myslet, že 't', 'h', 'i' a 's' jsou míněny jako argumenty, spíše než části doslovného názvu souboru k dotyku.)
To je ten jednoduchý případ, o který jste se postarali, ale není to to, na co jste se ptali; pokud chcete, aby název souboru obsahoval nějaký text nad rámec toho, co je uvedeno na řádcích v list
, věci se komplikují; xargs takový druh interpolace neumí. Místo toho byste potřebovali něco jako následující (což vyžaduje, aby váš shell byl bash
, jak je standardní u většiny systémů):
for file in `cat list`; do touch -- $file-customtext; done
Mějte na paměti, že to stále funguje pouze v případě, že každý řádek obsahuje pouze jediné slovo. V tomto příkazu $file
je nahrazeno názvem souboru zadaným na daném řádku v list
; vše kolem je bráno doslovně, takže tento příkaz s list
obsah výše by vytvořil následující soubory:
this-customtext
that-customtext
the-other-customtext
'-customtext' můžete samozřejmě nahradit čím chcete, a také můžete mít předponu i příponu; pokud jste místo toho měli do touch -- some-$file-text
, například by to fungovalo stejně dobře a výsledkem by byly soubory s názvem some-this-text
atd.
Nyní tedy předpokládejme obsah list
nejsou tak jednoduché -- konkrétně, že obsahují mezery, neslovní znaky nebo jiné věci, které shell nedokáže správně interpretovat. Pokud se zeptáte tří lidí, co by v tomto případě doporučili, pravděpodobně byste dostali pět odpovědí; Jsem hacker v Perlu, takže moje odpověď je Perl. Konkrétně předpokládejme list
který obsahuje:
This is the first line
of three (three?) lines
in the list file.
Způsob, jakým bych to udělal, by byl:
cat list | perl -ne'chomp; system(qq|touch -- "custom $_ text"|)'
Což vytváří výsledné soubory:
custom This is the first line text
custom of three (three?) lines text
custom in the list file. text
Vlastní text v tomto případě může být jakýkoli, mezery a tak dále, pokud neobsahuje ani "
(což bude matoucí touch
) ani '
(což bude matoucí perl
); v příkazu Perl $_
představuje obsah daného řádku z list
a vlastní text patří buď před něj, nebo za něj, ale do dvojitých uvozovek. (Vlastní text mimo dvojité uvozovky bude považován za touch
jako samostatný název souboru, který bude doslova vytvořen, pokud nebude obsahovat něco, co způsobí touch
k chybě.)