bash重命名文件问题?

时间:2013-04-05 09:56:40

标签: bash shell batch-file

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

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

它甚至不起作用。

4 个答案:

答案 0 :(得分:1)

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

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

或更快的替代方案:

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

答案 1 :(得分:0)

显示*/.txt */.xml表示有效地存在与给定模式匹配的文件,因为默认情况下,如果找不到匹配项,bash将使用逐字*

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

验证回显的线条看起来有点合理后,你必须更换

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

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

重命名文件。

答案 2 :(得分: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

答案 3 :(得分: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