我对 Linux 命令或 bash 脚本一无所知,所以请帮助我。我在不同的目录中有很多文件我想使用 bash 文件将所有这些文件从“name”重命名为“name.xml”是否可以这样做?我只是在互联网上找到这样的有用代码:
shopt -s globstar # enable ** globstar/recursivity
for i in **/*.txt; do
echo "$i" "${i/%.txt}.xml";
done
它甚至不起作用。
我对 Linux 命令或 bash 脚本一无所知,所以请帮助我。我在不同的目录中有很多文件我想使用 bash 文件将所有这些文件从“name”重命名为“name.xml”是否可以这样做?我只是在互联网上找到这样的有用代码:
shopt -s globstar # enable ** globstar/recursivity
for i in **/*.txt; do
echo "$i" "${i/%.txt}.xml";
done
它甚至不起作用。
为此prename
,许多 Linux 发行版上默认安装的实用程序派上用场,通常它与 Perl 包一起分发。你可以像这样使用它:
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"
和
mv "$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