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。我相信我的命令有问题,尼特的回答是正确的