Como duplicar um arquivo várias vezes ao incorporar um índice em cada arquivo

2

Eu tenho um arquivo chamado, por exemplo, ascdrgi.txt , com o seguinte conteúdo:

tiger
lion
cat

Eu quero duplicar este arquivo um número (variável) de vezes alterando o último caractere do nome do arquivo (ignorando a extensão). Por exemplo, neste caso, se eu fizesse 3 cópias, elas seriam nomeadas:

  • ascdrgj.txt
  • ascdrgk.txt
  • ascdrgl.txt

Se o nome do arquivo terminar com um número, esse número deverá aumentar, então as cópias de ascdrg1.txt serão:

  • ascdrg2.txt
  • ascdrg3.txt
  • ascdrg4.txt

Se o arquivo já existir, o script deve pular esse nome e passar para o próximo. Se chegarmos ao último caractere ( z , Z ou 9 ), ele deve estar em volta do início (o próximo seria a , A ou 1 , respectivamente). / p>

Além de duplicar o arquivo original, eu preciso modificar a primeira linha de cada arquivo para dizer qual arquivo ele é (numericamente), bem como o número total de arquivos. Usando o primeiro exemplo de ascdrgi.txt , esse arquivo agora conteria:

tiger number(1,4)
lion
cat

O próximo arquivo, ascdrgj.txt , conteria:

tiger number(2,4)
lion
cat

e assim por diante.

    
por dils 29.12.2015 / 16:29

2 respostas

2

O script de shell a seguir executará (a maioria) o que você precisa. Ele não modificará o arquivo original (não adicionará 'number' a ele) - apenas os arquivos recém-criados.

Espero que os comentários estejam claros o suficiente. Usar expr um pouco complicado em vez da expansão de parâmetro do bash deve torná-lo mais portátil:

#!/bin/sh

orig=ascdrg3.txt # start with this file

in=$orig
count=1 #loop variable
max=5   #number of files to create
while test "$count" -le "$max" ; do
    # Remove extension
    base=$(basename "$in" .txt)

    # get the prefix
    prefix=$(expr substr "$base" 1 $((${#base}-1)))

    # get last letter
    last=$(expr substr "$base" ${#base} 1)

    while true ;
    do
        # Advance letter, while the file doesn't exist
        last=$(echo "$last" | tr A-Z B-ZA)
        last=$(echo "$last" | tr a-z b-za)
        last=$(echo "$last" | tr 0-9 1-90)

        # construct new file name
        new="$prefix$last.txt"

        # continue if it doesn't exist
        # (otherwise, advance the last letter and try again)
        test -e "$new" || break

        test "$new" = "$orig" \
            && { echo "error: looped back to original file" >&2 ; exit 1; }
    done


    # Create new file
    cp "$orig" "$new"

    # Modify first line of new file
    sed -i "1s/\$/number($count,$max)/" "$new"

    # Advance counter
    count=$((count+1))

    # loop again
    in=$new
done
    
por 29.12.2015 / 18:44
0

Para o dígito caso:, se é como ab1.txt e você quer ab2.txt e ab3.txt e assim por diante:

  for i in 'seq 2 3' ; do cp ab1 ab$i.txt ; done

Você pode fazer uma coisa semelhante para o caso do alfabeto.

   for i in 'echo {d..f}' ; do cp abc.txt ab$i.txt ; done

resultará em abd.txt abe.txt abf.txt

    
por 29.12.2015 / 17:20