Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux AWK使用的替代方案_Linux_Bash_Shell_Awk_Mv - Fatal编程技术网

Linux AWK使用的替代方案

Linux AWK使用的替代方案,linux,bash,shell,awk,mv,Linux,Bash,Shell,Awk,Mv,我希望有一个更优雅的解决方案,用于大规模重命名文件,如下所示。文件的格式是DEV_XYZ_TIMESTAMP.dat,我们需要它们作为T-XYZ-TIMESTAMP.dat。 最后,我将它们全部复制到重命名的文件夹中(位于同一侧): ls -l *dat|awk '{system("cp " $10 " renamed/T-" substr($10, index($10, "_")+1))}' 所以,首先我列出了所有dat文件,然后选择第10列(文件名),并使用awk的系统函数执行一个命令。

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

ls -l *dat|awk '{system("cp " $10 " renamed/T-" substr($10, index($10, "_")+1))}'
所以,首先我列出了所有dat文件,然后选择第10列(文件名),并使用awk的系统函数执行一个命令。 该命令实际上是将原始文件名复制到具有新文件名的重命名文件夹中。 通过删除(包括)之前的(awk子字符串函数)前缀并添加“T-”前缀,创建了新文件名

实际上:

cp DEV_file.dat renamed/T-file.dat
有没有一种方法可以将
cp
mv
与一些正则表达式规则一起使用,以更优雅的方式实现相同的功能


Thx

您可以使用以下脚本:

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

我会这样做:

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-E“s/[^_]*/T/“-E”s//-/g”*dat

演示


是的,但一定要添加
#/bin/bash
shebang在第一行,因为如果
sh
拿到脚本,它会抱怨。@Quasímodo:Question也被标记为
bash
。@hummingBird:
f=“${file//-}”
中的
-
替换为
$file
中的
-
,并将结果存储在变量
f
“${f#*-}”
删除测试,直到
$f
@anubhava中的第一个
-
,当然,这是一个完全有效的答案,只是提醒OP。只是想让你们知道,在接受答案之前6分钟,我已经发布了我的答案。此外,在效率方面,如果某些事情完全可以在bash中完成,那么避免产生子流程和调用外部实用程序总是更快。Quasimodo的fork有两个子进程:一个用于命令替换,两个用于管道内部
$9…
。Awk是一种用于操作文本的工具。Shell是一种用于操作文件/进程以及对工具调用排序的工具。您试图使用awk操作(重命名)文件,因此使用了错误的工具-只需使用shell即可。请注意,有不同的重命名实用程序。根据您的系统,此命令可能具有不同的名称,例如arch上的
perl rename
。看见
$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
$