通过将中间字符串移动到文件名末尾来重命名文件

通过将中间字符串移动到文件名末尾来重命名文件

我有一些数据文件,我希望为我的管道重命名它们。

这些文件看起来像这样:

{unique_ids}_{experiment_condition}_L{3_digit_number}.txt

我需要重命名它们,以便实验条件标志将出现在文件名的末尾、扩展名之前,如下所示:

{unique_ids}_L{3_digit_number}_{experiment_condition}.txt

unique_ids 和experiment_condition 的长度不固定。

例子:

ghad312fd2_Mb_L002.txt变成ghad312fd2_L002_Mb.txt.

谢谢你!

答案1

使用基于 Perl 的rename实用程序重命名当前目录中与该模式匹配的所有文件./*_*_*.txt(即,其名称至少包含两个下划线并以 结尾的任何文件.txt):

rename -n 's/([^_]+)_([^_]+)\.txt$/$2_$1.txt/' ./*_*_*.txt

这会交换文件名的最后两个下划线分隔部分,不包括文件名后缀.txt-n确保它似乎在做正确的事情后,将其删除以真正运行它。

答案2

带壳zsh

autoload zmv
zmv  -n '(*)(_*)(_L[0-9](#c3))(.txt)' '$1$3$2$4'

-n如果满意,请删除(试运行))。

[0-9](#c3)匹配 3 个 ASCII 十进制数字的序列。您还可以用于<0-999>匹配从 0 到 999 的数字(请记住,它也可以匹配 0000123)或<->任何数字(一个或多个 ASCII 十进制数字的任何序列)。

答案3

也试试

for FN in gh*; do IFS="_." read ID XC NR EXT <<< "$FN"; echo mv -- "$FN" "${ID}_${NR}_${XC}.${EXT}"; done  

read是“此处字符串”中各自文件名的四个变量,并根据它们重建新文件名。echo如果对所看到的内容感到满意,请删除。

答案4

假设unique_ids没有下划线,将其放入脚本中并使用 GNUsed或任何其他sed支持的脚本运行它-E,并将文件名作为参数:

#!/bin/bash
for f in "$@" ; do
    new_name=$(echo "$f" | sed -E 's/([^_]+)_(.+)_(L[0-9]{3})\.txt/\1_\3_\2.txt/g')
    echo "$f -> $new_name"
    mv "$f" "$new_name"
done

相关内容