我有一个名为 的文件,其中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
等等。
答案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