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

Posted

技术标签:

【中文标题】使用 perl 表达式批量重命名文件【英文标题】:batch renaming of files with perl expressions 【发布时间】:2014-10-31 22:32:36 【问题描述】:

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

我要做的是重命名大约 100,000 个具有现有代码名称的压缩数据文件(例如: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 移动/重命名。有些文件有变量名(但总是以代码开头),所以我正在寻找一个查找和替换选项,只需用“名称”替换“代码”并保留文件名结构。

我怀疑我没有在 perl 表达式的单个刻度内转义变量,但是我翻阅了很多手册,但找不到这样做的方法。

【问题讨论】:

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

如果您绝对确定文件名不包含空格的制表符,您可以尝试下一个

xargs -n2 < names.txt echo mv

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

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

xargs -n2 < names.txt echo mv -i

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

xargs -n2 < names.txt echo mv -n

如果您满意,再次删除echo

【讨论】:

【参考方案2】:

我认为你不需要使用mmv,一个简单的mv 就可以了。此外,无需指定IFS,默认值即可:

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

我已经对变量名进行了双引号,因为这通常被认为是一种好的做法,但在这种情况下,任何一个文件名中的空格都会导致 read 无法按预期工作。

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

感谢您的意见!我已经试过了(上面应该更清楚,我会编辑),这适用于大约一半的数据文件名,但有些是通过变量名传送给我的,但它以代码指定开头,因此我是寻找更多的查找和替换(而不是重命名)功能。看起来我应该从 python 书上掸掉——这对我来说是个好习惯。再次感谢!

以上是关于使用 perl 表达式批量重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

2.13 批量重命名和移动

利用perl批量重命名文件

Linux下批量重命名的方法

用Perl regex替换批量重命名文件

如何以照片的拍摄时间批量重命名文件

批量重命名目录中的文件