2012-03-30 3 views
2

리눅스 컴퓨터의 [A, B, C..Z] 안에 여러 폴더가있는 폴더가 있습니다 (이름은 ../TEMPO). 각 폴더에는 폴더가 3 개 더 있습니다. 깊은 폴더 중 일부는 소문자 이름, 예와 같다 : 4 레벨에서리눅스 - 모든 폴더의 이름을 대상의 상단으로 바꿉니다.

A/F/m/O 
Z/t/q/S 

가 지금처럼 내가 같은 이름으로 유지하고자하는 파일이 있습니다.

파일 이름이 특정 폴더 (../TEMPO)로 변경되지 않고 어떻게 폴더 이름 만 대문자로 재귀 적으로 바꿀 수 있습니까?

+0

당신은 Windows가 아닌이 Linux에 태그를 붙였습니다. 그래서 나는 당신의 슬래시를 올바른 방향으로 만들 수있는 자유를 얻었습니다. – zwol

답변

3

이 명령

find path/to/dir -type d | awk -F"/" '$NF != toupper($NF) {l = n = $0; sub($NF "$", toupper($NF), n); print "mv " l " " n;}' | tac 

의 출력을 확인하고 잘 보이는 경우, 쉬하는 결과를 파이프하여 결과를 실행

find path/to/dir -type d | awk -F"/" '$NF != toupper($NF) {l = n = $0; sub($NF "$", toupper($NF), n); print "mv " l " " n;}' | tac | sh 
+0

아 미트, 마술처럼 작동했다. 정말 고마워! – user1199838

2

이 당신을 위해 작동 될 수 있습니다

for dir in `find ./TEMPO -type d -regex '.*[a-z].*' -print` ; do 
    udir=`echo $dir | tr [a-z] [A-Z]` 
    mv $dir $udir 
done 
+0

이 작업은 작동하지 않는 하나의 'mv'작업에서 여러 변경을 시도 할 것이라고 생각합니다. – zwol

+0

아, 네 말이 맞아 ... 내가 다시 쓸거야. –

+3

bash를 사용하면'udir = $ {dir ^^}'라고 쓸 수 있고 에코와 트롤을 호출 할 필요가 없다. –

2

한 번에 하나의 디렉토리 수준을 수행해야합니다. 기본 시스템 인 rename 전화는 한 번에 하나의 변경 만 할 수 있습니다.

도달 도구는 Perl과 함께 제공되는 rename 유틸리티입니다. 웹에서 설명서를 찾을 수 없거나 링크를 사용하고 있습니다. 쉘 프롬프트에서 man rename를 입력하면 이런 일을 제공하는 경우 :

NAME 
     rename - renames multiple files 

SYNOPSIS 
     rename [ -v ] [ -n ] [ -f ] perlexpr [ files ] 

는 당신은 옳은 일을해야합니다. 불행히도,이 작업에는 쓸모가없는 동일한 이름의 유틸리티가 하나 이상 있으며, 가지고있는 것을 알려주는 유일한 방법은 시도하는 것입니다. 당신은 당신이 한 문자 이름을 가진 네 개의 디렉토리 레벨을 알고 있기 때문에

, 당신은 너무처럼 디렉토리 레벨을 열거 할 수 있습니다 : 임의의 중첩이있을 수

rename 'y/a-z/A-Z/ if -d $_' ? 
rename 'y/a-z/A-Z/ if -d $_' ?/? 
rename 'y/a-z/A-Z/ if -d $_' ?/?/? 
rename 'y/a-z/A-Z/ if -d $_' ?/?/?/? 

경우, 영리 할 것이다.

0

당신이 perl의 일부입니다 prename가있는 경우, 당신은 매우 쉽게이 작업을 수행 할 수 있습니다

find ../TEMPO -depth -type d | xargs prename 's%/([^/]+)$%/\U$1%' 

당신은 그것이 옳은 일을 할 것입니다 확인하기 위해, -n-prename 먼저 통과 할 수 있습니다.

관련 문제