Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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 将目录中所有文件的文件名中的字符替换为另一个_Linux_Bash_Shell_Sed_Ksh - Fatal编程技术网

Linux 将目录中所有文件的文件名中的字符替换为另一个

Linux 将目录中所有文件的文件名中的字符替换为另一个,linux,bash,shell,sed,ksh,Linux,Bash,Shell,Sed,Ksh,我使用下面的脚本将所有文件的文件名中的字符替换为另一个 #!/bin/ksh for e in /mapr/datalake/rawfiles/P20170626005/* ; do mv "$e" "echo $e | sed -e 's/\P20170626*/P20170626005/g'";done 例如,尝试重命名P201706260001.txt=>P201706260050001.txt 但是得到一个错误: 无法将P201706260001.txt转换为P20170626005

我使用下面的脚本将所有文件的文件名中的字符替换为另一个

#!/bin/ksh
for e in /mapr/datalake/rawfiles/P20170626005/* ;
do mv "$e" "echo $e | sed -e 's/\P20170626*/P20170626005/g'";done 
例如,尝试重命名
P201706260001.txt=>P201706260050001.txt

但是得到一个错误:

无法将P201706260001.txt转换为P201706260050001.txt:没有此类文件或 目录


请帮助解决此问题。

提示:使用类似的循环显示您的输入和输出,以查看您正在处理的内容,例如:

for e in /mapr/datalake/rawfiles/P20170626005/*
do
    echo "$e"
    echo "$e" | sed -e 's/\P20170626*/P20170626005/g'
done

提示:使用类似的循环显示您的输入和输出,以查看您正在处理的内容,例如:

for e in /mapr/datalake/rawfiles/P20170626005/*
do
    echo "$e"
    echo "$e" | sed -e 's/\P20170626*/P20170626005/g'
done

您的mv命令似乎有问题。Echo应该被重新勾选

使用分组和反向引用进行有效转换。 您可以将脚本修改为

#!/bin/bash
for e in /mapr/datalake/rawfiles/P20170626005/*
do
    mv "$e" `echo $e | sed -e 's/\(.*\)P20170626\(.*\)/\1P20170626005\2/g'`
done 
(*)组尾部/前导文件名


\1&\2-返回引用尾随/前导文件名

您的mv命令似乎有问题。Echo应该被重新勾选

使用分组和反向引用进行有效转换。 您可以将脚本修改为

#!/bin/bash
for e in /mapr/datalake/rawfiles/P20170626005/*
do
    mv "$e" `echo $e | sed -e 's/\(.*\)P20170626\(.*\)/\1P20170626005\2/g'`
done 
(*)组尾部/前导文件名


\1&\2-返回引用尾随/前导文件名

替换
s/\P20170626*/P20170626005/
非常可疑
sed的正则表达式和shell的globbing都使用
*
,但它的含义不同(尽管相关)*
大致相当于
sed
中的
*
。在<代码> \p.<代码>中的反斜杠是奇怪的。因为您已经标记了<代码> BASH < /代码>,考虑使用而不是SED……您需要从同一个文件夹运行这个脚本,或者使用第一个代码>“$e”中的完整路径。。
s/\P20170626*/P20170626005/
的替换是非常可疑的,sed的正则表达式和shell的globbing都使用
*
,但它的含义不同(尽管相关)*大致相当于
sed
中的
*
。在<代码> \p.<代码>中的反斜杠是奇怪的。因为您已经标记了<代码> BASH < /代码>,考虑使用而不是SED……您需要从同一个文件夹运行这个脚本,或者使用第一个代码>“$e”< />代码中的完整路径。非常感谢NIT。这对我很有用。:)非常感谢你。这对我很有用。:)感谢您为这个问题花时间markp。我相信我的命令有问题,尼特的回答是正确的感谢您为这个问题花时间markp。我相信我的命令有问题,尼特的回答是正确的