Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建一个bash脚本,该脚本将降低当前文件夹中所有文件的大小写,然后搜索/替换所有文件?_Bash_Search_Replace - Fatal编程技术网

如何创建一个bash脚本,该脚本将降低当前文件夹中所有文件的大小写,然后搜索/替换所有文件?

如何创建一个bash脚本,该脚本将降低当前文件夹中所有文件的大小写,然后搜索/替换所有文件?,bash,search,replace,Bash,Search,Replace,答案#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 fil

答案#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
#!/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
#!/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文件改为小写,然后搜索/替换

所以,我想把这个变成:

This-Is-The-Output.html

为此:

this-is-the-output.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
我试着回想起我说过的话,看看第一步是否工作正常,但我得到了完全相同的错误

我甚至试着对除了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
#/垃圾箱/垃圾箱
对于*.php中的i;
#icleaned=`echo$i|sed s/\\./g`;

inew=“$(tr[A-Z][A-Z]类似的方法应该可以:

#!/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
更改为
*。

类似的操作应该可以:

#!/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
更改为
*。

根据要使用的注释更新-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

根据要使用的注释进行更新-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

这确实是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
#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
虽然它不检查大写字符,只是尝试转换所有内容(在已经是小写的文件上给出一个错误),但如果您知道只处理带有大写字符的文件,则可以使用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
#!/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

谢谢大家在这方面的帮助!

这确实是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
#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
虽然它不检查大写字符,只是尝试转换所有内容(在已经是小写的文件上给出一个错误),但如果您知道只处理带有大写字符的文件,则可以使用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
#!/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

谢谢大家在这方面的帮助!

你能描述一下它是如何工作的吗?试着用
echo$i$inew
而不是
mv$i$inew
来看看
$i
$inew
的值是否是你所期望的,有一件事,你不能像那样在
for
循环中堆叠语句在
中的关键字
后面添加一个字符串列表。
不像
while
循环,它允许在
do
关键字之前列出一个命令列表。@Lorkenpeist-我在帖子中添加了一些额外的细节。@chepner-我找到的所有示例都是用于,就像我说的,我在bash脚本编写方面非常无知,所以我所有的例子都是我真正能做的是试着把我发现的东西拼凑起来。答案应该被分成一个
答案
…这样问题仍然可以被看到吗?你能描述一下它是如何工作的吗?试着
echo$I$inew
而不是
mv$I$inew
看看
$I
$inew的值是否正确
是您所期望的。有一点,您不能像那样在
for
循环中堆叠语句。
for
循环在
中的关键字
之后获取字符串列表。它不像
while
循环,它允许在
do
关键字之前有一个命令列表。@Lorkenpeist-我已经为e post@chepner-我找到的所有例子都是用于,就像我说的,我对bash脚本非常无知,所以我真正能做的就是试着从我找到的东西中拼凑出一些东西。答案应该分为,
答案
…这样问题仍然可以被看到吗?你真的想使用double吗-引用字符串以避免严重事故:
mv“$file”“$lowercase”
sed-i“s/$file/$lowercase/g”“$f”
这不是最有效的,但我只是能够拼凑出一些有用的东西(在我的原始帖子中更新)。@aqua-我可能会使用你的版本并在