2013-12-10 45 views
2

Im努力用父文件夾名替換文件名並保存不同的文件結尾。用父文件夾名替換文件名而不改變文件結尾

示例;

.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 shellzmv

zmv '(*)/*' '$1/$1' 

但這是匹配所有。我不知道如何逃避文件結尾(如果可能的話)。也試過rename但沒有成功。

因爲我有多個sp folders(sp2, sp3, ..spN)和因爲每個e.g. sp1/含有大量的子文件夾像4287與同類型的文件,即時通訊尋求一個批次的解決方案。

任何指針,將不勝感激。

UPDATE

此工程時,在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 

回答

1

我不是很熟悉zmv,但我想這會做到這一點:

zmv '(*)/*.(*)' '$1/$1.$2' 
+0

它確實沒關係!我嘗試了類似的方法,但省略了最後一組括號。乾杯 –

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) 

編輯:如果文件或目錄包含空格,則第一個版本不起作用。

+0

乾杯,但似乎與zmv相比並不復雜。 –

相關問題