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

Rei*_*dos 5 bash rename

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

这些文件看起来像这样:

{unique_ids}_{experiment_condition}_L{3_digit_number}.txt
Run Code Online (Sandbox Code Playgroud)

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

{unique_ids}_L{3_digit_number}_{experiment_condition}.txt
Run Code Online (Sandbox Code Playgroud)

unique_ids 和experiment_condition 的长度不固定。

例子:

ghad312fd2_Mb_L002.txt变成ghad312fd2_L002_Mb.txt.

谢谢你!

Kus*_*nda 9

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

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

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

  • 我确实以为你使用的是 BSD :-)。我刚刚发现在 Archlinux 上,安装“perl-rename”确实保留了默认实用程序 GNU“rename”。德克萨斯州。 (3认同)

Sté*_*las 6

带壳zsh

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

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

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


Rud*_*diC 5

也试试

for FN in gh*; do IFS="_." read ID XC NR EXT <<< "$FN"; echo mv -- "$FN" "${ID}_${NR}_${XC}.${EXT}"; done  
Run Code Online (Sandbox Code Playgroud)

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

  • 我也在 1978 年左右开始使用 Fortran,在方格纸上手动编写程序,然后将其邮寄到当地大学,在那里一名秘书将它们输入到打孔卡上,以便技术人员通过大型机运行,并在一周后将输出邮寄回来告诉我忘记了一个分号。说“如果你知道……为什么要这样做”就像说如果你知道自己不会撞车为什么要系安全带?就像引用变量一样,您不会避免使用所有大写变量来防止您所知道的内容,您这样做是为了防止出现意外。 (3认同)
  • @doneal24 评论中有人主张名字全部大写,并声称自己是贝尔实验室的前雇员。作为在 AT&amp;T/贝尔实验室/朗讯/等公司工作过的人。我自己已经工作了 30 年,我向你保证,成为贝尔实验室的长期员工并不会在 shell 约定方面提供任何特定的权威,这只意味着你老了。在 C、Java、Go 或任何其他非古老的编程语言中,您不会看到人们使用全部大写的变量名来提高可读性以及与库函数等的区别,因此您应该在 shell 中这样做的论点并不存在保持水。 (2认同)
  • @doneal24 举一些例子,如果您查看备受推崇、经常引用且不断审查的 bash 常见问题解答,https://mywiki.wooledge.org/BashFAQ,如果您看到任何非导出变量,我会感到震惊全部大写,除非它们位于“不该做什么”部分。我刚才翻遍了也没找到。 (2认同)