1

答案#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")";'

很明显,剧本在很多方面都搞砸了。

任何人可以提供的帮助将不胜感激。

4

3 回答 3

3

根据@JS的评论更新以使用-exec:

find . -name '*[A-Z]*' -type f -exec bash -c 'echo "{}" | mv "{}" "$(tr A-Z a-z)"' \;

如果您安装了正确的版本,您也可以尝试重命名。检查您的手册页以进行重命名:

rename 'y/A-Z/a-z/' *

一个带有 mv 的单行代码,仅使用 find 搜索和重命名文件名中大写的文件。

for i in $(find . -name '*[A-Z]*' -type f); do mv "$i" "$(echo $i|tr A-Z a-z)"; done
于 2013-06-19T02:26:56.517 回答
1

像这样的东西应该工作:

#!/bin/bash

for file in *.html
do
    lowercase=`echo $file | tr '[A-Z]' '[a-z]'`
    mv "$file" "$lowercase"
    for f in *.html
    do
        sed -i "s/$file/$lowercase/g" "$f"
    done
done

如果您使用的不是 html 文件,请更改*.html为。*.<extension>

于 2013-06-19T00:37:25.507 回答
0

这确实是 OP 经过一番工作后得出的答案,但我想我会在这里将其分开,以免使问题变得混乱。

我最终从头开始,我能够拼凑出一些可行的东西!可能不是最有效的,但它可以完成工作。

#!/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

虽然它不检查大写字符,只是尝试转换所有内容(对已经是小写的文件给出错误),但如果你知道你只会处理带有大写字符的文件,你可以使用该版本那个阿克娅提交了。

#!/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

感谢大家对此的帮助!

于 2013-06-19T04:09:39.117 回答