如何更改以特定单词结尾的文件.fasta

如何更改以特定单词结尾的文件.fasta

如何选择和更改其中包含特定单词的文件以全部以“.fasta”结尾?

例如,我选择其中包含单词“car”的文件。

find /home/user -name "*car*"

这给了我

/home/user/car.txt
/home/user/scar.fa
/home/user/cart.fa
/home/user/scart.fasta

但我不知道如何改变它们,所以它们都以“.fasta”结尾

所以最终结果是

/home/user/car.fasta
/home/user/scar.fasta
/home/user/cart.fasta
/home/user/scart.fasta

答案1

我建议在选项中使用renameas 命令:-execfind

find /home/user -name "*car*" -exec rename 's/[^.]*$/fasta/' {} \;

匹配[^.]*$文件名末尾的所有非点并将其替换为fasta扩展名。

如果您不知道该命令,请查看man rename

答案2

对于 bash 解决方案,请参阅此概述子串删除

#!/bin/bash

for f in *car*; do
   [[ ${f##*.} == "fasta" ]] && continue

   f_no_ext="${f%%.*}"

   if [[ -e "${f_no_ext}.fasta" ]]; then
      echo "Not moving $f because it would clobber ${f_no_ext}.fasta"
      continue
   fi

   mv "$f" "${f_no_ext}.fasta"
done

exit

这将循环遍历所有*car*文件并将它们重命名为 .fasta 扩展名,并跳过那些已经以 .fasta 结尾的文件。我认为其他解决方案可能会忽略这一步。

编辑:我添加了if块来检查扩展名为 .fasta 的文件是否已存在,以避免覆盖文件。例如,如果您有 car.txt 和 car.fasta。

答案3

使用循环和mv命令的另一种方法:

find /home/user -type f -name "*car*" | while read f; do mv -v "$f" "${f%.*}.fasta"; done

相关内容