2010-01-12 5 views
1

리눅스 파일 서버 (RedHat Enterprise)에는 우리가 이름을 바꿀 필요가있는 몇몇 폴더가 있습니다. 이전 폴더 형식 (변경해야하는 형식)은 clientcode_jobnumberjobname입니다. 새 형식은 clientcode_jobnumber_jobname입니다. 기본적으로 jobnumberjobname 사이의 폴더 이름에 추가 밑줄을 추가하여 이전 폴더 이름을 변경해야합니다. 또한 새로운 형식으로 표시되도록 생성되는 모든 새 폴더 구조가 있으므로 변경하지 않아도됩니다. 작업 번호는 항상 1 문자 다음에 4 숫자가옵니다. 클라이언트 코드는 클라이언트에 따라 3-4 자입니다. 작업 이름은 모든 작업마다 다릅니다. 폴더는 모두 clients/clientname/jobs/clientcode/"folder that needs to be renamed"에 있습니다 (스크립트가 구조 안으로 들어가야하는 예제). 각 클라이언트의 각 clientcode에 대해이 작업을 수행해야합니다. 이 작업을 수행하는 스크립트를 어떻게 설정합니까? 어떤 도움이 크게 apprciated 것입니다. 이름을 바꿀 필요가있는 수천 개의 폴더가 있습니다.bash 리눅스 - 방대한 폴더 이름 바꾸기

답변

7

파일 이름에 sed와 같은 역할을하는 몇 가지 명령이 있습니다. mmv (또는 RHEL에서 찾을 수없는 rename, 이전 이름 ​​또는 rename.PL의 perl 변형)을 시도하십시오.

보너스로 두 가지 모두 -n 옵션 (작동 안함)이 있습니다. 따라서 할 일을 확인하면 문제가 발생하거나 정보를 잃지 않을 것입니다.

+0

+1 코드화하려는 욕구에 저항하기 때문에. –

+0

RH 이름 바꾸기는 데비안 이름 바꾸기와 다르기 때문에 여기서는 작동하지 않습니다. –

+0

때로는 '이름'이라고도합니다. –

0
for entry in * ; do 
    if [ ! -d "$entry" ] ; then 
    continue 
    fi 
    jobname="${entry##*_?????}" 
    dirbase="${entry%$jobname}" 
    if [ -z "$dirbase" -o -z "$jobname" ] ; then 
    echo "Error with '$entry'" 
    continue 
    fi 
    mv "$entry" "${dirbase}_$jobname" 
done 
0

아마도 나이지만, 디렉토리 구조가 어떻게 보이는지 정확히 알지 못합니다. 일부 코드 태그 내에 예제를 제공해 주시겠습니까? Noufal 이브라힘, 저항 :

그리고 아마도이 serverfault.com에 있어야

EDIT (!하지만 난 #은/빈/SH 스크립트 프로그래밍으로 간주 추측)? 모든 POSIX 호환 버전 또는 리눅스에서 작동하는 방식을 사용하고 있습니다. 그러나 Solaris 머신에는 rename 또는 mmv이 포함되어 있지 않습니다. 따라서 그러한 해결책은 불가능합니다. 당신이 이름 형식은 고도로 구조화 말하는 모든 것이 하나의 부모 아래에 있기 때문에

0

(중 당신이 언급 한 것과 있는지 직접 또는 간접 children..not로), 나는 이것을 제안 :

정기적 만들기 표현식을 사용하고 정규 표현식과 비교하여 대상 폴더의 내용 (이름을 바꿀 폴더가있는 이름)과 일치하는 작은 perl 스크립트를 작성하십시오. 일치하는 항목이 있으면 폴더의 이름을 새 이름으로 바꿉니다. Perl은이 모든 것을 쉽게 만듭니다.

당신이이 접근법을 추구하기로 결정한 경우에 대비하여 Perl을 알지 못하고 어디서부터 시작해야하는지 궁금해하고 내가 배우는 과정에 관심이 있다면 나는 " Minimal Perl "... 괴물 같은 언어를 배우고 지금 필요한 것과 비슷한 것들을 사용하는 빠르고 재미있는 방법.

희망이 도움이됩니다.

0
find /path/clients -type d -name "*_?[0-9][0-9][0-9][0-9]*" | while IFS= read -r DIR 
do 
    dir=${DIR##*/} 
    base=${DIR%/*} 
    IFS="_" 
    set -- $dir 
    front=$1 
    back=$2 
    jobname=${back#?????} 
    jobnum=${back%$jobname} 
    newname="${front}_${jobnum}_${jobname}" 
    echo mv "$DIR" "$base/$newname" 
done