使用 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)。
我尝试使用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"
...这是我的 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 表达式批量重命名文件的主要内容,如果未能解决你的问题,请参考以下文章