GNU/Linux >> Linux Esercitazione >  >> Linux

Come creare file che prendono il nome da linee in un file di testo sotto Linux

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


Linux
  1. Come creare uno scambio in Linux

  2. Come creare un file di scambio in Linux

  3. Crea file utilizzando la riga di comando in Linux

  4. Come creare file Proc Linux nel programma C usando LKM

  5. Come creare file sparsi in Linux usando il comando 'dd'

Come rinominare uno o più file in Linux

Come creare directory da un file di testo in Linux

Come stampare righe duplicate in un file di testo in Linux

Come trovare file contenenti una stringa di testo specifica in Linux

Come comprimere un file in Linux

Come creare file zip o directory protetti da password in Linux