我正在努力用父文件夹名称替换文件名并保留不同的文件结尾。
实施例
.sp1/4287/4287/iho.cst
.sp1/4287/4287/iho.dbf
.sp1/4287/4287/iho.prj
.sp1/4287/4287/iho.shp
.sp1/4287/4287/iho.shx
重命名为;
.sp1/4287/4287/4287.cst
.sp1/4287/4287/4287.dbf
.
.
.
我目前正在使用zsh shell
尝试zmv
。
zmv '(*)/*' '$1/$1'
但这与所有人相匹配。我不知道如何逃避文件结尾(如果可能的话)。还尝试了rename
,但没有成功。
由于我有多个sp folders
(sp2, sp3, ..spN)
,并且由于每个e.g. sp1/
包含许多子文件夹,例如4287
具有相同类型的文件,因此我正在寻找批处理解决方案。
任何指针都会受到赞赏。
更新
在spN / XXXX /;
中有效zmv '(*)/*.(*)' '$1/$1.$2';
如何编写遍历spN/XXXX/
文件夹并执行上述zmv
代码的循环?
#!/usr/bin/env zsh
source ~/.zshrc
for i in ./*;
for y in i;
do
zmv '(*)/*.(*)' '$1/$1.$2';
done
答案 0 :(得分:1)
我对zmv
并不熟悉,但我想这会做到:
zmv '(*)/*.(*)' '$1/$1.$2'
答案 1 :(得分:0)
我不知道zmv
但是请尝试这个脚本:
while read file
do
prefix=$(echo $file | sed 's|\(.*\)/.*$|\1|');
parent=$(echo $file | sed 's|.*/\([^/]\+\)/[^/]\+$|\1|');
child=$(echo $file | sed 's|.*/\([^.]\+\).*$|\1|');
ext=$(echo $file | sed 's|.*/[^.]\+\.\(.\+\)$|\1|');
mv "$prefix/$child.$ext" "$prefix/$parent.$ext"
done < <(find -type f)
编辑:如果文件或目录包含空格,则第一个版本无效。