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

5
这应该是很多人的基本问题,但我是一名没有编程背景的生物学家,请原谅我的问题。
我想做的是将约100,000个已经存在代码名称的gzipped数据文件重命名(例如: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"

这是我的文本文件的第一行,并使用单空格分隔符:

    cat names.txt

   #find #replace 
   code1 name1
   code2 name2
   code3 name3

我知道我可以用Python或Perl来完成这个任务,但是因为我现在只能在这个Bash脚本上工作,所以我希望找到一个简单的解决方法来修复它,并弄清楚我的错误在哪里。非常感谢任何可能提供的帮助。

此外,我尝试使用cat命令读取names文件(请参见下面Ashoka Lella的评论),然后使用awk命令移动/重命名一些文件的变量名称(始终以“code”开头),因此我正在寻找替换选项,只需将“code”替换为“name”并保留文件名结构。

我怀疑我没有在perl表达式的单引号中转义变量,但我已经阅读了很多手册,也找不到解决方法。


所有的答案都适用于您提供的示例。如果您的文件名在现实中更复杂(即它们包含空格/特殊字符),那么您应该编辑您的问题以显示更好地代表情况的一些示例。如果您需要更复杂的逻辑(条件重命名、模式匹配等),那么您应该清楚地表明,在问题中展示所需行为的一些示例。 - Tom Fenech
谢谢你的帮助,汤姆,我非常感激。看起来我的大部分问题都与不符合规范的“代码”有关,当这些代码随机分布在几千个数据文件中时,使得答案不太直接。我可能会尝试用Python脚本解决这个问题,但我希望有更简单的方法。再次感谢你帮助我学习更好的解决方法! - Josh Herr
3个回答

3
如果您绝对确定文件名不包含空格或制表符,则可以尝试以下操作。
xargs -n2 < names.txt echo mv

这是DRY运行(仅打印执行步骤)的操作——如果您对结果满意,请删除echo ...。
如果您想要检查目标是否存在,请使用:
xargs -n2 < names.txt echo mv -i

如果你想永远不允许覆盖目标,请使用以下方法:

xargs -n2 < names.txt echo mv -n

如果您满意,可以再次删除echo


3

我认为你不需要使用 mmv,一个简单的 mv 就可以了。并且,没有必要指定 IFS,默认值就适用于你:

while read -r src dest; do mv "$src" "$dest"; done < names.txt

我已经将变量名用双引号括起来,这通常被认为是良好的实践,但在这种情况下,任何一个文件名中含有空格都会导致 read 命令不能按预期工作。
你可以在循环内部的 mv 前面加上 echo 来确保正确的命令将被执行。
请注意,在你的文件 names.txt 中,.fasta.gz 后缀已经包含在内,因此你不应该在循环内再次添加它。也许这就是你的问题所在?

1
这将重命名names.txt中列1的所有文件为列2。前提是它们与names.txt在同一个文件夹中。
cat names.txt| awk '{print "mv "$1" "$2}'|sh

感谢您的回复!我已经尝试过这个方法了(可能上面表述不够清楚,我会修改),这个方法可以处理大约一半的数据文件名,但是有些文件名是带有变量名的,并且以代码命名开头,因此我正在寻找更多的查找和替换(而不是重命名)功能。看起来我应该翻阅一下 Python 书籍——这对我来说是一个很好的练习。再次感谢! - Josh Herr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接