Bash,如何从脚本重命名几个文件夹中的文件?

朱尔斯

我有一个shell / bash脚本,它将在其文件夹内重命名某些文件。我在几个文件夹中都有这个相同的文件。我想要一个可以处理所有文件夹的文件。

#!/bin/bash
for name in *.png; do
    # remove everything after the last '-' including the dash
    # and add the '.png' extension back
    newname="${name%-*}.png"
    mv "$name" "$newname"
done
罗伯特·L

如果您只想在目录的顶层(即一层)中处理文件,则不需要递归。

这两个示例都将目录列表作为参数,并仅重命名那些目录中与更排他的模式相匹配的文件:(*-*.png以避免mv命令失败)。

不会更改目录的脚本

在第一个脚本的for循环内部,变量name除了基本文件名之外,还包含文件的目录路径。

#!/bin/sh
for dir in "$@"
do
    for name in "$dir"/*-*.png
    do
        mv "$name" "${name%-*}.png"
    done
done

一个脚本DOES更改目录:

在第二个脚本中,在for循环内,name变量仅包含文件名,因为当前目录已临时更改为script参数。

括号(之间的代码在子外壳程序环境中)执行,这意味着更改当前目录以及变量集对外壳程序脚本不可见,从而消除了将“目录”更改回原始目录的麻烦。

#!/bin/sh
for dir in "$@"
do
    (
        if cd "$dir"
        then
            for name in ./*-*.png
            do
                mv "$name" "${name%-*}.png"
            done
        fi
    )
done

关于这两个脚本的注意事项:

"$@"扩展到脚本的命令行参数。该脚本将无提示地静默地执行任何操作。

目录名称参数可以是任何绝对路径(/path/to/dirx)或相对路径(dirxpath/to/diry...../x/d1,等)。

消息将在标准错误流(错误)由任一被印刷mv或者cd如果给定的目录不存在,或者如果没有*-*.png在一个目录中的文件。该脚本将继续处理后续目录。

可以#!/bin/sh代替这些脚本的第一行,bash因为该脚本不使用任何bash功能,因此可以使用更具移植性,与posix兼容并且可能更快的脚本sh很少有脚本需要bash外壳程序的额外功能由于这些原因和其他原因#!/bin/bash,一般不建议使用脚本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章