Supponiamo di dover rinominare i seguenti file di log con estensione .txt:
file.log.090714
file.log.090715
file.log.090716
$ for i in `ls file.log.*`; do mv $i $i.txt; done
Il risultato sarà il seguente:
file.log.090714.txt
file.log.090715.txt
file.log.090716.txt
Se volessimo concatenare tutti i file con estensione .txt possiamo ricorrere al classico comando cat.
$ cat *.txt > newfile
Se invece prima di concatenarli volessimo aggiungere un delimitatore alla fine di ogni singolo file (o una riga vuota) per trattamenti futuri o semplicemente per capire ad occhio quando un file finisce e comincia l’altro possiamo usare la seguente riga di comando:
$ for i in `ls file.log.*`; do echo "" >> $i; done
In questo caso il delimitatore è una riga vuota aggiunta alla fine di tutti i file il cui nome comincia con file.log


L'esecuzione di ls è inutile, in effetti.Per il secondo esempio, infatti,for i in file.log.*; do … ; donefunziona allo stesso modo, grazie all'espansione di bash.Ed entrambi i metodi soffrono di problemi con filename con spazi all'interno: per quelli servirebbe unls file.log.* | { while read i; do echo "$i"; done; }capace di matchare i file "file.log.a" e "file.log spazio"
Utile, grazie per le info (anche a TankMiche).