使用perl表达式批量重命名文件

Jos*_*err 5 regex bash perl rename batch-file

这应该是很多人的基本问题,但我是一名没有编程背景的生物学家,所以请原谅我的问题.

我要做的是重命名大约100,000个具有代码名称的gzip压缩数据文件(例如:XG453834.fasta.gz).我想把它们命名为易于阅读和解析的东西(例如:Xanthomonas_galactus_str_453.fasta.gz).

我试图使用sed,rename而且mmv无济于事.如果我在一次性脚本上使用任何这些命令,那么它们工作正常,就在我尝试将变量合并到shell脚本中时,我遇到了问题.我没有收到任何错误,只是没有更改名称,所以我怀疑这是一个I/O错误.

这是我的文件的样子:

#! /bin/bash
# change a bunch of file names
file=names.txt

while IFS=' '  read -r r1 r2;
do
    mmv ''$r1'.fasta.gz' ''$r2'.fasta.gz'
    # or I tried many versions of: sed -i 's/"$r1"/"$r2"/' *.gz
    # and I tried many versions of: rename -i 's/$r1/$r2/' *.gz

done < "$file"
Run Code Online (Sandbox Code Playgroud)

...这里是我的txt文件的第一行,带有单个空格分隔符:

    cat names.txt

   #find #replace 
   code1 name1
   code2 name2
   code3 name3
Run Code Online (Sandbox Code Playgroud)

我知道我可以用python或perl来做这件事,但是由于我在这里工作这个特定的脚本我想找到一个简单的解决方案来修复这个bash脚本并弄清楚我做错了什么.非常感谢您提供任何帮助.

此外,我尝试cat了名称文件(请参阅下面的Ashoka Lella的评论),然后使用awk移动/重命名.有些文件有变量名(但总是以代码开头),所以我正在寻找一个find&replace选项,只需用"name"替换"code"并保留文件名结构.

我怀疑我没有在perl表达式的单个tick中转义变量,但是我已经倾注了很多手册,我找不到这样做的方法.

Ash*_*lla 1

这应该将names.txt的column1中的所有文件重命名为column2。前提是它们与 names.txt 位于同一文件夹中

cat names.txt| awk '{print "mv "$1" "$2}'|sh
Run Code Online (Sandbox Code Playgroud)