我试图使用bash重命名目录中与特定模式匹配的所有.txt文件。我在下面的两次尝试已从目录中删除文件并引发错误。谢谢:)
输入

16-0000_File-A_variant_strandbias_readcount.vcf.hg19_multianno_dbremoved_removed_final_index_inheritence_import.txt
16-0002_File-B_variant_strandbias_readcount.vcf.hg19_multianno_dbremoved_removed_final_index_inheritence_import.txt

期望输出
16-0000_File-A_multianno.txt
16-0002_File-B_multianno.txt

重击尝试1this removes the files from the directory
for f in /home/cmccabe/Desktop/test/vcf/overall/annovar/*_classify.txt ; do
 # Grab file prefix.
 p=${f%%_*_}
 bname=`basename $f`
 pref=${bname%%.txt}
 mv "$f" ${p}_multianno.txt
done

重击尝试2Substitution replacement not terminated at (eval 1) line 1.
for f in /home/cmccabe/Desktop/test/vcf/overall/annovar/*_classify.txt ; do
 # Grab file prefix.
 p=${f%%_*_}
 bname=`basename $f`
 pref=${bname%%.txt}
 rename -n 's/^$f/' *${p}_multianno.txt
done

最佳答案

你不需要循环。rename只有这样才能做到:

rename -n 's/(.*?_[^_]+).*/${1}_multianno.txt/g' /home/cmccabe/Desktop/test/vcf/overall/annovar/*_classify.txt

正则表达式的含义大致是,
捕捉从开始到第二个_
其他的匹配,
替换为捕获的前缀并附加_multianno.txt
使用-n标志时,此命令将打印它将执行的操作而不实际执行。
当输出看起来良好时,删除-n并重新运行。

关于bash - 重命名目录中特定类型的所有文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42041486/

10-12 16:25