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

时间:2015-05-30 23:29:01

标签: regex bash shell sed

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

#! /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并执行它。但这对我来说似乎很脏。

有人有建议吗?

2 个答案:

答案 0 :(得分:1)

如果您关心文字数据,请不要使用echo。其结果尚未明确定义。

您可以使用printf,也可以使用POSIX,它不会破坏数据。

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

答案 1 :(得分:0)

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

NewName="${OldName//\\/}"

示例:

OldName="FLD\01.02.2015 thefile.pdf"
NewName="${OldName//\\/}"
echo "$NewName"

它会打印出来:

FLD01.02.2015 thefile.pdf

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