答案#1:我最终从头开始,并且能够拼凑出一些可行的东西!可能不是最有效的,但它可以完成工作。
#!/bin/bash
for file in *.php
do
#Check to see if the filename contains any uppercase characters
iscap=`echo $file | awk '{if ($0 ~ /[[:upper:]]/) print }'`
if [[ -n $iscap ]]
then
#If the filename contains upper case characters convert them to lower case
newname=`echo $file | tr '[A-Z]' '[a-z]'` #make lower case
#Perform various search/replaces on the file name to clean things up
newname=$(echo "$newname" | sed 's/---/-/')
newname=$(echo "$newname" | sed 's/--/-/')
newname=$(echo "$newname" | sed 's/-\./\./')
newname=$(echo "$newname" | sed 's/there-s-/theres-/')
#Rename file
echo "Moving $file\n To $newname\n\n"
mv $file $newname
#Update all references to the new filename in all php files
`sed -i "s/$file/$newname/g" *.php`
fi
done
答案#2:虽然它不检查大写字符,只是尝试转换所有内容(对已经是小写的文件给出错误),如果你知道你只会处理带有大写字符的文件,你可以使用aqua提交的版本。
#!/bin/bash
for file in *.php
do
newname=`echo $file | tr '[A-Z]' '[a-z]'`
newname=$(echo "$newname" | sed 's/---/-/')
newname=$(echo "$newname" | sed 's/--/-/')
newname=$(echo "$newname" | sed 's/-\./\./')
newname=$(echo "$newname" | sed 's/there-s-/theres-/')
mv "$file" "$newname"
for f in *.php
do
sed -i "s/$file/$newname/g" *.php
done
done
感谢大家对此的帮助!
原始问题和附加信息
我正在使用一些软件为开源软件项目创建文档,除了它输出带有大写字符的 HTML 文件,不推荐用于 SEO。所以,我正在尝试编写一个 bash 脚本,它将所有 .html 文件更改为小写,然后搜索/替换
所以,我想把这个:
这是输出.html
进入这个:
这是输出.html
然后在当前目录中的所有文件中搜索“This-Is-The-Output.html”并将其替换为“this-is-the-output.html”。
我一直在尝试根据我在网上找到的东西拼凑一些东西,但我就是无法让它发挥作用。我和其他人一样缺乏编写 bash 脚本的经验,所以我想我会求助于 SO 看看是否有人可以提供帮助。
这就是我目前正在使用的...
#!/bin/sh
for i in *.php;
icleaned=`echo $i | sed s/./\\./g`;
inew="$(tr [A-Z] [a-z] <<< "$icleaned")";
sed -i 's/$i/$inew/g' *.php;
do mv $i $inew;
done
第 3 行:搜索和替换特殊字符,例如“.”
第 4 行:将干净的小写字符串分配给 $inew
第 5 行:搜索/替换所有对旧文件名的引用到新文件名
第 6 行:将文件从旧文件名移动到新文件名
我得到的错误是:
line 3: syntax error near unexpected token `icleaned=`echo $i | sed s/./\\./g`'
line 3: ` icleaned=`echo $i | sed s/./\\./g`;'
我尝试只是回显 icleaned 以查看第一步是否正常工作,但我得到了完全相同的错误。
我什至尝试注释掉除 inew= 行之外的所有内容:
#!/bin/sh
for i in *.php;
# icleaned=`echo $i | sed s/./\\./g`;
inew="$(tr [A-Z] [a-z] <<< "$i")";
echo $inew;
# sed -i 's/$i/$inew/g' *.php;
# do mv $i $inew;
done
而且我仍然收到“意外令牌附近的语法错误”错误。
line 4: syntax error near unexpected token `inew="$(tr [A-Z] [a-z] <<< "$i")"'
line 4: ` inew="$(tr [A-Z] [a-z] <<< "$i")";'
很明显,剧本在很多方面都搞砸了。
任何人可以提供的帮助将不胜感激。