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

时间:2014-09-07 15:25:04

标签: regex bash perl batch-file rename

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

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

我尝试使用sedrenamemmv无效。如果我在一次性脚本上使用任何这些命令,那么它们工作正常,就在我尝试将变量合并到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"

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

    cat names.txt

   #find #replace 
   code1 name1
   code2 name2
   code3 name3

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

此外,我尝试cat名称文件(请参阅下面的Ashoka Lella的评论),然后使用awk移动/重命名。一些文件具有变量名称(但总是以代码开头),所以我正在寻找一个查找和放大器。替换选项只需替换&#34;代码&#34;使用&#34;名称&#34;并保留文件名结构。

我怀疑我没有在perl表达式的单个刻度内转义变量,但是我已经倾注了大量的手册,我无法找到实现此目的的方法。

3 个答案:

答案 0 :(得分:3)

如果您确定文件名不包含空格标签,则可以尝试下一个

xargs -n2 < names.txt echo mv

这是用于DRY运行(仅打印将要执行的操作) - 如果您对结果感到满意,请删除echo ...

如果要检查目标是否存在,请使用

xargs -n2 < names.txt echo mv -i

如果你想永远不允许覆盖目标用途

xargs -n2 < names.txt echo mv -n

再次,如果您满意,请删除echo

答案 1 :(得分:3)

我认为你不需要使用mmv,简单的mv会这样做。此外,无需指定IFS,默认设置适用于您:

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

我引用了变量名称,因为它通常被认为是一种好习惯,但在这种情况下,任一文件名中的空格都会导致read无法正常工作。

您可以在循环内echo之前加mv,以确保执行正确的命令。

请注意,在您的文件names.txt中,已包含.fasta.gz后缀,因此您不应将其添加到循环内。也许那是你的问题?

答案 2 :(得分:1)

这应该将names1中的所有文件重命名为names.txt的column2。如果它们与names.txt在同一文件夹中

cat names.txt| awk '{print "mv "$1" "$2}'|sh