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

标签 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 移动/重命名。一些文件有变量名(但总是以代码开头),所以我正在寻找一个查找和替换选项,以将“代码”替换为“名称”并保留文件名结构。

我怀疑我并没有在 perl 表达式的单个勾号内转义变量,但我已经翻阅了很多手册,但找不到执行此操作的方法。

最佳答案

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

xargs -n2 < names.txt echo mv

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

如果你想检查目标是否存在,使用

xargs -n2 < names.txt echo mv -i

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

xargs -n2 < names.txt echo mv -n

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

关于regex - 使用 perl 表达式批量重命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25711833/

相关文章:

linux - 在 shell 中解析 ps 和 grep 输出

c - 守护进程/后台通过脚本从另一个程序启动的进程

perl - rand() 在 perl 中不是那么随机

R:正则表达式捕获给定字符之后的所有实例

java - 正则表达式匹配数字后跟空格

bash - 在 grep -v 命令后轻松计算文件夹中文件列表中的单词

perl - Perl 中的数组初始化

javascript - 使用正则表达式拆分复杂的字符串

c# - 用于字符串操作的正则表达式模式

bash - 检查 bash 中是否至少存在一个文件