0

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

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

它甚至不起作用。

4

4 回答 4

1

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

find . -iname '*.txt' -exec prename 's/.txt/.xml/' {} \;

或者这个更快的选择:

find . -iname '*.txt' | xargs prename 's/.txt/.xml/'
于 2013-04-05T10:08:52.400 回答
0

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

为防止出现此问题,您必须另外设置shopt -s nullglobbash 在根本没有匹配项时不返回任何内容。

在验证回显线看起来有些合理后,您必须更换

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

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

重命名文件。

于 2013-04-05T10:12:37.863 回答
0

您可以使用此 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
于 2013-04-05T10:15:59.113 回答
0

解释

移动/重命名当前目录和以下目录中的所有文件(无论扩展名是什么)从namename.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
于 2013-04-05T10:21:35.517 回答