我有一个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
如果您只想在目录的顶层(即一层)中处理文件,则不需要递归。
这两个示例都将目录列表作为参数,并仅重命名那些目录中与更排他的模式相匹配的文件:(*-*.png
以避免mv
命令失败)。
在第一个脚本的for
循环内部,变量name
除了基本文件名之外,还包含文件的目录路径。
#!/bin/sh
for dir in "$@"
do
for name in "$dir"/*-*.png
do
mv "$name" "${name%-*}.png"
done
done
在第二个脚本中,在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
)或相对路径(dirx
,path/to/diry
,.
,..
,../x/d1
,等)。
消息将在标准错误流(错误)由任一被印刷mv
或者cd
如果给定的目录不存在,或者如果没有*-*.png
在一个目录中的文件。该脚本将继续处理后续目录。
可以#!/bin/sh
代替这些脚本的第一行,bash
因为该脚本不使用任何bash
功能,因此可以使用更具移植性,与posix兼容并且可能更快的脚本sh
。很少有脚本需要bash
外壳程序的额外功能。由于这些原因和其他原因#!/bin/bash
,一般不建议使用脚本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句