我正在尝试编写一个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并执行它。但这对我来说似乎很脏。
有人有建议吗?
答案 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参数扩展。