我在当前目录中有一堆具有不同名称的目录:
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 中默认安装的命令,例如mv
、find
、sed
、vim
、grep
等。目录名称可能包含$
、&
、.
等符号字符,因此也请容纳奇怪的名称。
答案1
我只想这样做:
autoload zmv
zmv '(*)/(*)(.*)' '$1$3'