2013-12-10 3 views
2

파일 이름을 상위 폴더 이름으로 바꾸고 다른 파일 끝을 보존하는 데 어려움을 겪고 있습니다.파일 끝자리를 변경하지 않고 파일 이름을 상위 폴더 이름으로 바꾸기

예;

.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을 시도했지만 성공하지 못했습니다.

나는 각 e.g. sp1/ 파일의 동일한 유형 4287 같은 하위 폴더를 많이 포함하고 있기 때문에, 임 배치 솔루션을 추구 (sp2, sp3, ..spN)sp folders 다양하고 가지고 있기 때문에.

모든 포인터가 감사하겠습니다.

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와 비교하여 불필요하게 복잡해 보입니다. –

관련 문제