如何在ls输出中按照从左到右的顺序更改文件名?



我有一个目录,其中有相同后缀的文件:

$ 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知识做了同样的事情。

下面的代码;

  1. 生成后缀并将其保存到数组(001,002等)
  2. 为所有.gbk文件创建一个循环
  3. 使用regex从文件名解析必要的前缀(如k141_1208259.region)
  4. 合并前缀(k141_1208259.region)和后缀(002)->(如k141_1208259.region002)
  5. 通过移动
  6. 重命名文件
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

这段代码可能会给你一个想法。

相关内容

  • 没有找到相关文章