我有一个文件目录,其名称格式类似于
01-Peterson@2x.png
15-Consolidated@2x.png
03-Brady@2x.png
我想格式化它们
PETERSON.png
CONSOLIDATED.png
BRADY.png
但是我的bash脚本编写技能目前非常薄弱。最好的方法是什么?
编辑:我的bash版本是3.2.57(1)-发行版
答案 0 :(得分:2)
如果所有文件的模式都类似于您发布的模式,那么您可以做一些简单的事情,就像在目录上运行该文件一样:
for file in `ls *.png`; do new_file=`echo $file | awk -F"-" '{print $2}' | awk -F"@" '{n=split($2,a,"."); print toupper($1) "." a[2]}'`; mv $file $new_file; done
如果您想学习其他解决方案(例如正则表达式),也可以这样做:
for file in `ls *.png`; do new_file=`echo $file | sed "s/.*-//g;s/@.*\././g" | tr '[:lower:]' '[:upper:]'`; mv $file $new_file; done
对其进行测试,例如:
mv 01-Peterson@2x.png PETERSON.png
mv 02-Bradley@2x.png BRADLEY.png
mv 03-Jacobs@2x.png JACOBS.png
mv 04-Matts@1x.png MATTS.png
mv 05-Jackson@4x.png JACKSON.png
答案 1 :(得分:2)
这将适用于包含空格(包括换行符),反斜杠或任何其他字符的文件,包括可能导致目录中其他文件错误匹配的字符,并且不会删除给定的主文件系统一个特别不受欢迎的文件名!
for old in *.png; do
new=$(
awk 'BEGIN {
base = sfx = ARGV[1]
sub(/^.*\./,"",sfx)
sub(/^[^-]+-/,"",base)
sub(/@[^@.]+\.[^.]+$/,"",base)
print toupper(base) "." sfx
exit
}' "$old"
) &&
mv -- "$old" "$new"
done