AWK 使用的替代方案

Alternative for AWK use

我希望有一个更优雅的文件批量重命名解决方案,如下所示。文件的格式为 DEV_XYZ_TIMESTAMP.dat,我们需要它们为 T-XYZ-TIMESTAMP.dat。 最后,我将它们全部复制(在同一侧)到 renamed 文件夹中:

ls -l *dat|awk '{system("cp "  " renamed/T-" substr(, index(, "_")+1))}'

所以,首先我列出了所有 dat 文件,然后选择第 10 列(文件名)并使用 awk 的 system 函数执行命令。 该命令实质上是将原始文件名复制到具有新文件名的 renamed 文件夹中。 通过在(包括)_ 之前删除(awk substring 函数)前缀并添加 "T-" 前缀来创建新文件名。

有效:

cp DEV_file.dat renamed/T-file.dat

有没有办法将 cpmv 与一些正则表达式规则一起使用,以更优雅的方式实现相同的目的?

感谢

您可以使用这个脚本:

for file in *.dat; do
   f="${file//_/-}"
   mv "$file" renamed/T-"${f#*-}"
done

You must avoid parsing output of ls command.

我会这样做:

cpdir=renamed
for file in *dat; do
    newfile=$(echo "$file" | sed -e "s/[^_]*/T/" -e "y/_/-/")
    cp "$file" "$cpdir/$newfile"
done

sed 脚本转换单个 T 中的每个非下划线前导字符,然后将每个 _ 替换为 -。如果在执行前不确定cpdir是否存在,您可以在第一行后简单地添加mkdir "$cpdir"

如果你有 rename 实用程序

rename -E "s/[^_]*/T/" -e "s/_/-/g" *dat

演示

$ls -1
ABC_DEF_TIMESTAMP.dat
DEV_XYZ_TIMESTAMP.dat
$rename -E  "s/[^_]*/T/" -e "s/_/-/g" * 
$ls -1
T-DEF-TIMESTAMP.dat
T-XYZ-TIMESTAMP.dat
$