我有一个目录,其中有相同后缀的文件:
$ ls ./*.gbk
k141_1208254.region001.gbk
k141_1374899.region001.gbk
k141_1398938.region001.gbk
k141_1444319.region001.gbk
k141_46645.region001.gbk
我想用另一种方式来区分这些文件,根据从左到右的方向改变。region00#.
这是期望的输出:
k141_1208254.region001.gbk
k141_1374899.region002.gbk
k141_1398938.region003.gbk
k141_1444319.region004.gbk
k141_46645.region005.gbk
有几个文件夹有*.gbk
文件。我该怎么做呢?
这样做的一种方法是:
#!/usr/bin/env bash
counter=1
for f in *.region001.gbk; do # iterate over filenames ending in .region001.gbk
[[ -e $f || -L $f ]] || { # if we have a file that doesn't exist:
echo "ERROR: $f not found" >&2 # ...write an error message to stderr...
exit 1 # ...and exit the script early.
fi
prefix=${f%.region001.gbk} # strip the suffix off the name to get the prefix
printf -v suffix 'region%03d.gbk' # calculate a new suffix
newName="${prefix}.${suffix}" # append that to the prefix to get the new name
if [[ $f != $newName ]]; then # if that new name differs from the old name...
mv -- "$f" "$newName" # ...then rename the file.
fi
(( ++counter )) # finally, increment the counter.
done
注意,不覆盖现有的输出文件(如果目录中已经存在任何.region002
等文件)留给读者作为练习。
@Charles Duffy的答案看起来很好,很有信息量,但是我用我可怜的bash知识做了同样的事情。
下面的代码;
- 生成后缀并将其保存到数组(001,002等)
- 为所有.gbk文件创建一个循环
- 使用regex从文件名解析必要的前缀(如k141_1208259.region)
- 合并前缀(k141_1208259.region)和后缀(002)->(如k141_1208259.region002)
- 通过移动 重命名文件
pad=1000; # 3 digit fixed
declare -a suffixes
file_count=$(ls -l *gbk | wc -l)
for i in $(seq $file_count);
do ((j=pad+i))
count=${j#?}
suffixes+=($count)
done
iteration=0
for i in ./*.gbk ; do
if [[ "$i" =~ ^./(([-_a-zA-Z0-9.]*.)region)[0-9]*(.gbk)$ ]];
then
mv "$i" "${BASH_REMATCH[1]}${suffixes[iteration]}.gbk" ;
((iteration++))
fi
done
这段代码可能会给你一个想法。