GNU/Linux >> Znalost Linux >  >> Linux

Jak vytvořit soubory pojmenované podle řádků v textovém souboru pod Linuxem

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


Linux
  1. Jak vytvořit odkládací soubor v Linuxu

  2. Jak vytvořit soubory Linux Proc v programu C pomocí LKM

  3. Jak rozeznat binární soubory od textových souborů v linuxu

  1. Jak přidat čísla řádků do textových souborů v systému Linux

  2. Jak vytvořit swap v Linuxu

  3. Jak vygenerovat seznam jedinečných řádků v textovém souboru pomocí skriptu Linux shell?

  1. Vytvářejte soubory pomocí příkazového řádku v Linuxu

  2. Jak vytvořit řídké soubory v Linuxu pomocí příkazu „dd“.

  3. Jak tarovat, rozbalovat soubory a prohlížet obsah souboru tar pod Linuxem