我的目录下有几个文件,其名称的形式为*.foo.bar
.我想编写一个 bash 脚本来通过删除部分来重命名每个文件.foo
。
例如,假设发出tree ~/dir/
回报
/home/user/dir/
|- george.foo.bar
|- john.foo.bar
|- paul.foo.bar
|- ringo.foo.bar
|- subdir
|- jimmy.foo.bar
|- robert.foo
然后运行script ~/foo/
应该将内容更改~/foo
为
/home/user/dir/
|- george.bar
|- john.bar
|- paul.bar
|- ringo.bar
|- subdir
|- jimmy.bar
|- robert.foo
答案1
您可以使用参数扩展机制
shopt -s globstar
for file in **/*foo.bar; do
prefix="${file%.foo*}"
suffix="${file##*.foo}"
mv -v -- "$file" "$prefix$suffix"
done
删除${file%.foo*}
匹配的后缀(仅保留前缀),并${file#*.foo}
删除前缀(保留后缀)。**
需要双星 glob ( ) 来遍历所有子目录并setopt -s globstar
允许该 glob。
答案2
要将当前目录及其子目录中的所有文件重命名为.foo.bar
to :.bar
rename 's/\.foo\.bar/\.bar/' * */*
这里rename
是 perl 包中的重命名实用程序。在某些系统上,它可能被称为prename
.
(不幸的是,rename
某些系统还从软件包中安装了一个可执行文件util-linux
。它是不相容.)