如何选择和更改其中包含特定单词的文件以全部以“.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
我建议在选项中使用rename
as 命令:-exec
find
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