이름 바꾸기를 사용하여 모든 이름을 대문자로 재귀적으로 바꾸는 방법

이름 바꾸기를 사용하여 모든 이름을 대문자로 재귀적으로 바꾸는 방법

모든 파일과 폴더(하위 폴더)의 이름을 반복적으로 대문자로 바꾸고 싶습니다.

소문자로 변환하는 일부 스크립트를 찾았지만 변경하는 방법을 모르므로 반대 방향(소형에서 대형)으로 수행됩니다.

내가 찾은 스크립트는 소문자로 작동하지만 수정 방법을 모르겠습니다.

rename 'y/A-Z/a-z/' *

에서 man rename.

답변1

이용하고 계시니 참고하세요Perl 스크립트는 다음과 같이 호출됩니다.renameDebian 및 그 파생 제품(Ubuntu, Mint 등)에 의해 배포됩니다. 다른 Linux 배포판에서는 다음과 같은 완전히 다르고 덜 유용한 명령을 제공합니다.rename.

y/A-Z/a-z/범위 A의 각 문자를 범위의 해당 문자 Z로 변환합니다 . 즉, ASCII 대문자가 해당 소문자로 변환됩니다. 반대 변환을 수행하려면 을 사용하십시오 . 동일한 명령을 작성하는 또 다른 방법은 -  입니다.azy/a-z/A-Z/rename '$_ = uc($_)' *ucrename변수 에 대한 변환을 기반으로 $_파일 이름을 바꾸는 ase 함수입니다 .

rename '…' *일치하는 파일 이므로 현재 디렉터리의 파일 이름만 바꾸세요 *.파일 클릭이름이 .()로 시작하는 파일도 건너뜁니다.

현재 디렉터리와 하위 디렉터리의 파일 이름을 반복적으로 바꾸려면 다음을 사용할 수 있습니다.find이 명령은 현재 디렉터리를 재귀적으로 탐색합니다. 여기에는 어려움이 있습니다. 을 rename호출하면 디렉토리와 기본 이름 부분의 이름이 변경됩니다. rename디렉토리로 재귀하기 전에 디렉토리()를 호출 find -exec rename … {} \;하면 디렉토리 find를 찾기 때문에 혼란스러울 것입니다. 그러나 그 디렉토리로 내려가려고 할 때 그 디렉토리는 더 이상 존재하지 않습니다. 작업을 수행하기 전에 디렉터리를 반복하여 이 문제를 해결할 수 있지만 find결국 이름을 바꾸려고 시도하게 되고 foo/bar디렉터리 FOO/BARFOO존재하지 않게 됩니다.

이러한 어려움을 피하는 쉬운 방법은 이름 바꾸기 명령이 경로의 기본 이름 부분에서만 작동하도록 하는 것입니다. 정규식 일치 ([^/]*\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

이 답변에 아직 연결되어 있는 사람에게 안내하고 싶습니다.훌륭한 답변Guiles Quernot이 원치 않는 질문을 했습니다 find.

결과 명령은 다음과 같습니다:

shopt -s globstar
rename -n 'y/a-z/A-Z/' **

그러나 실행하기 전에 이전 bash 버전에 대한 경고에 대한 링크된 답변을 읽으십시오.

y///마지막으로 명령이 무엇인지 알고 싶은 사람이 있으면 perl regex다음 링크를 참조하세요.관련된 문서.

답변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

관련 정보