Как дублировать файл несколько раз при встраивании индекса в каждый файл

У меня есть файл с именем, например, ascdrgi.txt , со следующим содержимым:

 tiger lion cat 

Я хочу дублировать этот файл (переменное) количество раз, изменив последний символ имени файла (игнорируя расширение). Например, в этом случае, если бы я сделал 3 копии, они были бы названы:

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

Если имя файла заканчивается номером, это число должно увеличиваться вместо этого, поэтому копии ascdrg1.txt будут:

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

Если файл уже существует, сценарий должен пропустить это имя и перейти к следующему. Если мы дойдем до последнего символа ( z , Z или 9 ), он должен начать цикл до начала (следующим будет a , A или 1 соответственно).

В дополнение к дублированию исходного файла, мне нужно изменить первую строку каждого файла, чтобы указать, какой файл он (численно), а также общее количество файлов. Используя первый пример ascdrgi.txt , этот файл теперь будет содержать:

 tiger number(1,4) lion cat 

Следующий файл ascdrgj.txt будет содержать:

 tiger number(2,4) lion cat 

и так далее.

Следующий сценарий оболочки будет выполнять (большинство) то, что вам нужно. Он не будет изменять исходный файл (а не добавлять к нему «номер») – только только что созданные файлы.

Надеемся, что комментарии достаточно ясны. Использование нескольких свернутых expr вместо расширения параметра bash должно сделать его более портативным:

 #!/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 AZ B-ZA) last=$(echo "$last" | tr az 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 

Для случая с цифрами:, если это похоже на ab1.txt, и вы хотите ab2.txt и ab3.txt и так далее:

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

Вы можете сделать аналогичную вещь для случая алфавита.

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

приведет к abd.txt abe.txt abf.txt