我知道有很多这样的问题,但我找不到一个(或几个的组合)来描述我想要做的事情。我想我需要使用正则表达式,但我不太擅长。我使用 zsh。我有一个包含文件的文件夹,我想重命名它:
我想要将文件
challenge1.rb
、、challenge2.rb
等challenge3.rb
重命名为c1.rb
、c2.rb
等。同样task1.rb
,和 similar 也必须重命名为t1.rb
etc。sample_spec_c1.rb
等sample_spec_c2.rb
必须重命名为等c1_spec.rb
。c2_spec.rb
所以我想我需要正则表达式和迭代的某种组合,但我不知道如何编写 bash 脚本。
答案1
这是一个简短的脚本,可以完成您想要的操作。您可以使用以下文件列表调用该脚本:./scriptname *.rb
或使用目录(它将递归它们):./scriptname .
不要忘记设置可执行位:chmod a+x scriptname
。
#!/bin/sh
suff=rb # suffix of files to rename
script="$0" # this script name for recursion
for f in "$@" ; do
if test -d "$f" ; then
echo "=== recursing directory $f"
find "$f" -type f -name "*.$suff" -exec "$script" {} +
elif test -f "$f" ; then
d="$(dirname "$f")"
b="$(basename "$f")"
r="$(echo "$b" | sed -r "s/^([a-zA-Z])[a-zA-Z]*([0-9]+\.${suff})\$/\1\2/;s/^[a-zA-Z]+_([a-zA-Z]+)_([a-zA-Z]+[0-9]+)(\.${suff})\$/\2_\1\3/")"
echo "-- renaming $f -> $d/$r"
mv "$f" "$d/$r"
fi
done