使用父文件夹名称替换文件名而不更改文件结尾

时间:2013-12-10 04:40:21

标签: rename zsh batch-rename

我正在努力用父文件夹名称替换文件名并保留不同的文件结尾。

实施例

.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

2 个答案:

答案 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)

编辑:如果文件或目录包含空格,则第一个版本无效。