我有一些数据文件,我希望为我的管道重命名它们。
这些文件看起来像这样:
{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