Bash 脚本删除目录下每个文件中的部分文件名

Bash 脚本删除目录下每个文件中的部分文件名

我的目录下有几个文件,其名称的形式为*.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.barto :.bar

rename 's/\.foo\.bar/\.bar/'  * */*

这里rename是 perl 包中的重命名实用程序。在某些系统上,它可能被称为prename.

(不幸的是,rename某些系统还从软件包中安装了一个可执行文件util-linux。它是不相容.)

相关内容