모든 파일과 폴더(하위 폴더)의 이름을 반복적으로 대문자로 바꾸고 싶습니다.
소문자로 변환하는 일부 스크립트를 찾았지만 변경하는 방법을 모르므로 반대 방향(소형에서 대형)으로 수행됩니다.
내가 찾은 스크립트는 소문자로 작동하지만 수정 방법을 모르겠습니다.
rename 'y/A-Z/a-z/' *
에서 man rename
.
답변1
이용하고 계시니 참고하세요Perl 스크립트는 다음과 같이 호출됩니다.rename
Debian 및 그 파생 제품(Ubuntu, Mint 등)에 의해 배포됩니다. 다른 Linux 배포판에서는 다음과 같은 완전히 다르고 덜 유용한 명령을 제공합니다.rename
.
y/A-Z/a-z/
범위 A
의 각 문자를 범위의 해당 문자 Z
로 변환합니다 . 즉, ASCII 대문자가 해당 소문자로 변환됩니다. 반대 변환을 수행하려면 을 사용하십시오 . 동일한 명령을 작성하는 또 다른 방법은 - 입니다.a
z
y/a-z/A-Z/
rename '$_ = uc($_)' *
uc
너펠씨rename
변수 에 대한 변환을 기반으로 $_
파일 이름을 바꾸는 ase 함수입니다 .
rename '…' *
일치하는 파일 이므로 현재 디렉터리의 파일 이름만 바꾸세요 *
.파일 클릭이름이 .
()로 시작하는 파일도 건너뜁니다.
현재 디렉터리와 하위 디렉터리의 파일 이름을 반복적으로 바꾸려면 다음을 사용할 수 있습니다.find
이 명령은 현재 디렉터리를 재귀적으로 탐색합니다. 여기에는 어려움이 있습니다. 을 rename
호출하면 디렉토리와 기본 이름 부분의 이름이 변경됩니다. rename
디렉토리로 재귀하기 전에 디렉토리()를 호출 find -exec rename … {} \;
하면 디렉토리 find
를 찾기 때문에 혼란스러울 것입니다. 그러나 그 디렉토리로 내려가려고 할 때 그 디렉토리는 더 이상 존재하지 않습니다. 작업을 수행하기 전에 디렉터리를 반복하여 이 문제를 해결할 수 있지만 find
결국 이름을 바꾸려고 시도하게 되고 foo/bar
디렉터리 FOO/BAR
가 FOO
존재하지 않게 됩니다.
이러한 어려움을 피하는 쉬운 방법은 이름 바꾸기 명령이 경로의 기본 이름 부분에서만 작동하도록 하는 것입니다. 정규식 일치 ([^/]*\Z)
에는 가 포함되지 않습니다 /
.
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
껍데기嘚보다 편리한 이름 변경 기능을 제공합니다. Perl보다 훨씬 더 난해하지만 더 간결하고 일반적으로 작성하기가 더 쉽습니다.
기능zmv
패턴에 따라 파일 이름을 바꿉니다. autoload -U zmv
활성화하려면 한 번 실행하세요 (이 줄을 귀하의 줄에 넣으세요 .zshrc
).
zmv
(교체할 패턴)의 첫 번째 인수에서 zsh의 기능을 사용할 수 있습니다.와일드카드 패턴. zmv
(대체 텍스트)의 두 번째 매개변수 에서는매개변수 확장다음을 포함한 기능기록 수정자.
zmv -w '**/*' '$1$2:u'
설명하다:
-w
— 각 와일드카드 패턴에 숫자 변수를 자동으로 할당합니다.**/*
— 하위 디렉터리의 모든 파일, 재귀적으로(**/
0, 1 또는 그 이상의 하위 디렉터리 수준과 일치)$1
— 각 경로의 디렉터리 부분이 일치하는 첫 번째 숫자 변수$2:u
— 두 번째 숫자 변수. 여기서는 각 경로의 기본 이름 부분과 일치하고:u
수정자를 사용하여 값을 대문자로 변환합니다.
추가 보너스로 이는 환경 로케일을 존중합니다.
zmv
작성 중인 명령이 확실하지 않은 경우 옵션을 전달하여 -n
아무것도 변경하지 않고 명령이 수행할 작업을 인쇄할 수 있습니다. 출력을 확인하고 원하는 대로 작동하면 -n
실제로 작업을 수행하지 않고 명령을 다시 실행하십시오.
답변2
답변3
Gilles의 게시물에서 도난당함(약간 수정됨)여기
find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +
답변4
파일 이름을 바꾸려는 디렉터리로 이동한 후 다음을 시도해 보세요.
for word in `ls -ltr |tail -n +2 |awk '{print $9}'`
do
a=$(echo $word | tr '[a-z]' '[A-Z]')
mv $word $a
echo "Done Successfully"
done