用于递归查找和更改文件扩展名的 Bash 脚本

用于递归查找和更改文件扩展名的 Bash 脚本

我想编写一个小脚本来更改目录中具有特定扩展名(例如.png或 )的所有文件的文件扩展名.gif

我的想法是该脚本在执行时只需要两个参数。第一个是要更改的扩展名,第二个是要更改为的扩展名。

最初我想我会用它read来获取目标目录,但这使得这太复杂了,所以我只是让它在当前目录中工作。我运行的是 Debian 9,因此该rename命令不可用。

这适用于固定内容(txt 到 rdf):

$ find -depth -name "*.txt" -exec sh -c 'mv "$1" "${1%.txt}.rdf"' _ {} \;

但是,我不知道如何更改继承传递参数的变量内容的扩展名。默认情况下这些将是 $1 $2 但当我按如下方式更改它时,它不起作用。

$ find -depth -name "*.$1" -exec sh -c 'mv "$1" "${1%.$1}.$2"' _ {} \;

此示例仅附加一个 .到所有匹配文件的末尾。我在这里缺少什么?

答案1

#!/bin/sh

find . -depth -name "*.$1" -exec sh -c '
    from=$1
    to=$2
    shift 2
    for pathname do
        mv "$pathname" "${pathname%.$from}.$to"
    done' sh "$1" "$2" {} +

这让内部脚本将文件名后缀作为参数以及要更改的路径名列表。在内部脚本中,您提取两个后缀并将它们从参数列表中移出,然后循环遍历从find.

效率较低(每个路径名调用一次,sh -c而不是循环一批路径名):

#!/bin/sh

find . -depth -name "*.$1" -exec sh -c 'mv "$3" "${3%.$1}.$2"' sh "$1" "$2" {} ';'

作为旁注:请养成使用shfind-sh或其他相关名称作为内部脚本的第零个参数的习惯。该参数用在脚本的错误消息中,并且错误消息的来源_在某些情况下可能会令人困惑。

相关内容