Regex 用于重命名包含反斜杠的文件名的脚本

Regex 用于重命名包含反斜杠的文件名的脚本,regex,bash,shell,sed,Regex,Bash,Shell,Sed,我正在尝试编写一个shell脚本来重命名7-zipped文件夹的结果。生成的文件名在文件名中包含反斜杠“”。 我写了一篇简单的文章: #! /bin/sh for n in * do OldName=$n NewName=`echo "$n" | tr -s '\' "#" | tr -s " " "_"` echo $NewName mv "$OldName" "$NewName" done 我的问题是\01由echo解释,我的文件是: FLD\01.02.2015 the

我正在尝试编写一个shell脚本来重命名7-zipped文件夹的结果。生成的文件名在文件名中包含反斜杠“”。 我写了一篇简单的文章:

#! /bin/sh

for n in * do
  OldName=$n
  NewName=`echo "$n" | tr -s '\' "#" | tr -s " " "_"`
  echo $NewName
  mv "$OldName" "$NewName"
done
我的问题是\01由echo解释,我的文件是: FLD\01.02.2015 thefile.pdf

因此,echo“FLD\01.02.2015 thefile.pdf”返回FLD?.2015

我尝试过各种替代方案,s/\/\\\\/g、sed、tr。 我试着改用printf 我在网上到处搜索,没有找到有效的解决办法

什么都不管用。我需要一个可以在Unix和Mac OS X上运行的解决方案

唯一“有效”的解决办法是

ls > liste.txt
sed -e 's/\\/,/g' liste.txt
然后解析liste.txt,转义反斜杠,生成rename.sh并执行它。但我觉得这真的很肮脏


有人有什么建议吗

如果您关心文字数据,请不要使用
echo
。其结果没有很好的定义

您可以改为使用
printf
,也可以使用POSIX,它不会损坏数据

NewName=`printf "%s" "$n" | tr -s '\' "#" | tr -s " " "_"`

您可以这样做(在Bash中),而不是使用
echo
重命名文件名:

例如:

OldName="FLD\01.02.2015 thefile.pdf"
NewName="${OldName//\\/}"
echo "$NewName"
它将打印出:

FLD01.02.2015 thefile.pdf

注意:您需要将shebang更改为
#/bin/bash
使用bash参数扩展。

太棒了!我不知道参数扩展${mystring//search/replace}非常感谢!
FLD01.02.2015 thefile.pdf