Due parti a questo, per me - prima - usare cat per inviare il file di testo allo standard output e usare append per aggiungerlo a un altro file - ad esempio foo.txt>>bar.txt aggiungerà foo.txt a bar.txt
quindi eseguilo n volte con
for i in {1..n};do cat foo.txt >> bar.txt; done
sostituendo n in quel comando con il tuo numero
dovrebbe funzionare, dove n è il tuo numero
Se usi csh, c'è il comando 'repeat'.
ripetere le parti correlate della risposta vengono copiate da qui e l'ho testato su un sistema Ubuntu 11.04 sulla shell bash predefinita.
 Puoi certamente usare cat per questo:
$ cat /tmp/f
foo
$ cat /tmp/foo /tmp/f
foo
foo
 Per ottenere $n copie, potresti usare yes convogliato in head -n $n :
$ yes /tmp/f | head -n 10
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
/tmp/f
Metterlo insieme dà
yes /tmp/f | head -n $n | xargs cat >/tmp/output
 Sono annoiato, quindi ecco alcuni altri metodi su come concatenare un file a se stesso, principalmente con head come stampella. Perdonami se mi spiego troppo, mi piace dire cose :P
 Supponendo N è il numero di autoconcatenazioni che vuoi fare e che il tuo file si chiami file .
Variabili:
linecount=$(<file wc -l)
total_repeats=$(echo "2^$N - 1" | bc) # obtained through the power of MATH
total_lines=$((linecount*(total_repeats+1)))
tmp=$(mktemp --suffix .concat.self)
 Data una copia di file chiamato file2 , total_repeats è il numero di volte file dovrebbe essere aggiunto a file2 per renderlo uguale a file è stato concatenato a se stesso N volte.
Detto MATH è qui, più o meno:MATH (essenza)
 È roba di informatica del primo semestre, ma è passato un po' di tempo dall'ultima volta che ho fatto una dimostrazione di induzione, quindi non riesco a superarla... (anche questa classe di ricorsione è abbastanza nota per essere 2^Loops quindi c'è anche quello....)
POSIX
Uso alcune cose non posix ma non sono essenziali. Per i miei scopi:
 yes() { while true; do echo "$1"; done; }
Oh, ho usato solo quello. Vabbè, la sezione è già qui...
Metodi
 head con monitoraggio del numero di righe.
ln=$linecount
for i in $(seq 1 $N); do
    <file head -n $ln >> file;
    ln=$((ln*2))
done
Nessun file temporaneo, nessun gatto, nemmeno troppa matematica ancora, tutta gioia.
 tee con MATH 
<file tee -a file | head -n $total_lines > $tmp
cat $tmp > file
 Qui tee sta leggendo da file ma aggiungendovi continuamente, quindi continuerà a leggere il file ripetutamente fino a head lo ferma. E sappiamo quando fermarlo grazie a MATH . L'aggiunta va oltre, quindi ho usato un file temporaneo. Potresti tagliare le righe in eccesso da file anche.
 eval , il signore delle tenebre!
eval "cat $(yes file | head -n $((total_repeats+1)) | tr '\n' ' ')" > $tmp
cat $tmp > file
 Questo si espande solo a cat file file file ... e lo valuta. Puoi farlo senza $tmp anche file:
eval "cat $(yes file | head -n $total_repeats | tr '\n' ' ')" |
  head -n $((total_lines-linecount)) >> file
 Il secondo head "trucchi" cat mettendo un intermediario tra esso e l'operazione di scrittura. Potresti ingannare cat con un altro cat pure ma che ha un comportamento incoerente. Prova questo:
test_double_cat() {
    local Expected=0
    local Got=0
    local R=0
    local file="$(mktemp --suffix .double.cat)"
    for i in $(seq 1 100); do
        printf "" > $file
        echo "1" >> $file
        echo "2" >> $file
        echo "3" >> $file
        Expected=$((3*$(<file wc -l)))
        cat $file $file | cat >> $file
        Got=$(<file wc -l)
        [ "$Expected" = "$Got" ] && R="$((R+1))"
    done
    echo "Got it right $R/100"
    rm $file
}
 sed :
<file tr '\n' '\0' |
    sed -e "s/.*/$(yes '\0' | head -n $total_repeats | tr -d '\n')/g" |
        tr '\0' '\n' >> file
 Forza sed nel leggere l'intero file come una riga, lo cattura tutto, quindi lo incolla $total_repeats numero di volte.
Questo ovviamente fallirà se hai caratteri nulli nel tuo file. Scegline uno che sai non c'è.
find_missing_char() {
  local file="${1:-/dev/stdin}"
  firstbyte="$(<$file fold -w1 | od -An -tuC | sort -un | head -n 1)"
  if [ ! "$firstbyte" = "0" ]; then
    echo "\0"
  else
    printf "\\$(printf '%03o\t' $((firstbyte-1)) )"
  fi
}
Per ora è tutto ragazzi, spero che questa risposta arbitraria non abbia disturbato nessuno. Li ho testati tutti molte volte, ma sono solo un utente di shell da due anni, quindi tienilo a mente, immagino. Ora a dormire...
 rm $tmp