如何将目录中的文件重命名为其各自的目录名称,同时保留文件的扩展名?

如何将目录中的文件重命名为其各自的目录名称,同时保留文件的扩展名?

我在当前目录中有一堆具有不同名称的目录:

Hello World/
Dr. Dre - Still Dre/
Angry Birds/
2018 Grand Prix Race Highlights/

每个目录中都有文件(每个目录各一个):

source.c
song.aac
setup.apk
spanish.mp4

我想将每个文件重命名为其目录名称,但扩展名不应更改。示例输出文件:

Hello World.c
Dr. Dre - Still Dre.aac
Angry Birds.apk
2018 Grand Prix Race Highlights.mp4

输出位置并不重要。

我发现了很多在当前目录中重命名文件的解决方案for file in *mv "$file" "${file/oldname/newname}"但我的文件位于 1 层深度的子目录中,所以我目前拥有的是:

currdir=$(pwd)
for dir in */
do
  cd ${dir}
  file=$(echo *)
  ext=${file##*.}
  mv "*" "${dir}.${ext}"
  cd ${currdir}
done

我正在使用 zsh,当我尝试运行这个函数时,zsh: source.c not found我怀疑该行可能有问题file=$(echo *)。我也不喜欢我在那里所做的事情的复杂性,所以也许有一种更干净的方法,甚至是一句台词。我只想使用 Ubuntu 中默认安装的命令,例如mvfindsedvimgrep等。目录名称可能包含$&.等符号字符,因此也请容纳奇怪的名称。

答案1

我只想这样做:

autoload zmv
zmv '(*)/(*)(.*)' '$1$3'

相关内容