如何多次复制一个文件,同时在每个文件中嵌入索引

如何多次复制一个文件,同时在每个文件中嵌入索引

我有一个名为 的文件,其中ascdrgi.txt包含以下内容:

tiger
lion
cat

我想通过更改文件名的最后一个字符(忽略扩展名)来重复此文件(可变)次数。例如,在本例中,如果我制作了 3 个副本,它们将被命名为:

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

如果文件名以数字结尾,则该数字应该增加,因此副本ascdrg1.txt将是:

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

如果该文件已存在,则脚本应跳过该名称并移至下一个。如果我们到达最后一个字符(zZ、 或9),它应该循环到开头(下一个字符分别是aA、 或1)。

除了复制原始文件之外,我还需要修改每个文件的第一行以说明它是哪个文件(数字)以及文件总数。使用第一个ascdrgi.txt示例,该文件现在包含:

tiger number(1,4)
lion
cat

下一个文件 ,ascdrgj.txt将包含:

tiger number(2,4)
lion
cat

等等。

答案1

以下 shell 脚本将执行(大部分)您需要的操作。它不会修改原始文件(不会添加“数字”) - 只会修改新创建的文件。

希望评论足够清楚。使用有点复杂的方法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 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

答案2

对于数字大小写: ,如果它像 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

相关内容