我想编写一个小脚本来更改目录中具有特定扩展名(例如.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" {} ';'
作为旁注:请养成使用sh
或find-sh
或其他相关名称作为内部脚本的第零个参数的习惯。该参数用在脚本的错误消息中,并且错误消息的来源_
在某些情况下可能会令人困惑。