bash重命名文件问题?

bash重命名文件问题?,bash,shell,batch-file,Bash,Shell,Batch File,我对Linux命令和bash脚本一无所知,请帮助我。 我在不同的目录中有很多文件,我想用bash文件将所有这些文件从“name”重命名为“name.xml”,有可能吗?我只是在互联网上找到这样的有用代码: shopt -s globstar # enable ** globstar/recursivity for i in **/*.txt; do echo "$i" "${i/%.txt}.xml"; done find . -iname '*.txt' -exec prename 's/.

我对Linux命令和bash脚本一无所知,请帮助我。 我在不同的目录中有很多文件,我想用bash文件将所有这些文件从“name”重命名为“name.xml”,有可能吗?我只是在互联网上找到这样的有用代码:

shopt -s globstar # enable ** globstar/recursivity
for i in **/*.txt; do
echo "$i" "${i/%.txt}.xml";
done
find . -iname '*.txt' -exec prename 's/.txt/.xml/' {} \;

它甚至不起作用。

为此,许多Linux发行版默认安装的
prename
实用程序派上了用场,通常随Perl包一起发行。您可以这样使用它:

shopt -s globstar # enable ** globstar/recursivity
for i in **/*.txt; do
echo "$i" "${i/%.txt}.xml";
done
find . -iname '*.txt' -exec prename 's/.txt/.xml/' {} \;
或者这个更快的选择:

find . -iname '*.txt' | xargs prename 's/.txt/.xml/'

显示
*/.txt*/.xml
意味着实际上没有与给定模式匹配的文件,因为默认情况下,如果没有找到匹配项,bash将使用逐字
*

为了防止这个问题,您必须另外设置
shopt-s nullglob
,使bash在根本没有匹配项时不返回任何内容

在验证回音线是否合理后,您必须更换

echo "$i" "${i/%.txt}.xml"


重命名文件。

您可以使用此bash脚本

#!/bin/bash
DIRECTORY=/your/base/dir/here
for i in `find $DIRECTORY -type d -exec find {} -type f  -name \*.txt\;`;
do mv $i $i.xml
done
解释 将当前目录及以下目录中的所有文件(无论扩展名是什么)从
name
移动/重命名为
name.xml
。在运行真正的脚本之前,应该使用
echo
进行测试

shopt -s globstar # enable ** globstar/recursivity
for i in **; do # **/*.txt will look only for .txt files
    [[ -d "$i" ]] && continue # skip directories
    echo "$i" "$i.xml"; # replace 'echo' by 'mv' when validated
    #echo "$i" "${i/%.txt}.xml"; # replace .txt by .xml
done

“甚至不起作用”不是很有用。输出是什么?您是如何运行它的?在我使用“bash file.sh”之后,它只显示了一次*/.txt*/.xml,这是逐字的吗?即使匹配失败,也应该是
***/.txt
(注意两个星号)和
***/.xml
。您引用的Bash脚本只查找.txt文件。请注意,要使用globstar,您需要bash>=4。这不是最好的方法,因为它也会将目录作为directory.xml进行回显。请看我的回答它工作起来就像一个符咒一样完美谢谢,但是如果我想编辑它来替换.txt文件,如何?请参见for循环行上的注释和注释echo