이름 바꾸기를 사용하여 매번 대문자로 재귀 적으로 이름을 바꾸는 방법 (하위 폴더)를 재귀 적으로

모든 파일과 폴더 (하위 폴더)를 재귀 적으로 대문자로 바꾸고 싶습니다.

소문자로 처리 할 스크립트를 찾았지만 변경 방법을 모르므로 다른 방법으로 (아래에서 위) 수행합니다.

내가 발견하고 소문자로 작동하지만 수정하는 방법을 몰랐던 스크립트는 다음과 같습니다.

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

에서 온 것 man rename입니다.



답변

데비안과 파생어 (Ubuntu, Mint,…)에서 배포 한 Perl 스크립트를rename 사용하고 있습니다. 다른 Linux 배포판은 완전히 다르지만별로 유용하지 않은 명령을 제공합니다 rename.

y/A-Z/a-z/범위의 각 문자 변환 A을 통해 Z범위에서 해당 문자로 a를 통해 z, 해당 소문자 문자로 즉, ASCII 대문자. 반대 변환을 수행하려면을 사용하십시오 y/a-z/A-Z/. 동일한 커맨드를 기입하는 또 다른 방법은 rename '$_ = uc($_)' *–  uc은 IS U pper C ASE 기능 및 rename명령하게 변화에 따라 파일 이름을 변경 $_변수.

rename '…' **일치 하는 것이기 때문에 현재 디렉토리의 파일 이름 만 바꿉니다 . 도트 파일 (이름이로 시작하는 파일 .)도 건너 뜁니다.

현재 디렉토리 및 서브 디렉토리의 파일 이름을 재귀 적으로 바꾸려면 find명령을 사용 하여 현재 디렉토리를 재귀 적으로 탐색 할 수 있습니다 . 여기에 어려움이 있습니다.을 호출 rename하면 디렉토리와 기본 이름 부분의 이름이 모두 바뀝니다. rename디렉토리 ( find -exec rename … {} \;) 로 돌아 가기 전에 디렉토리 를 호출 하면 디렉토리 find가 발견 되었기 때문에 혼란스러워 지지만 해당 디렉토리는 더 이상 디렉토리로 내려 가려고 할 때까지 존재하지 않습니다. find조치를 취하기 전에 디렉토리를 순회하도록 지시 하여이 문제를 해결할 수 있지만 이름 foo/bar을 바꾸려고 FOO/BAR하지만 디렉토리 FOO가 존재하지 않습니다.

이 어려움을 피하는 간단한 방법은 이름 바꾸기 명령이 경로의 기본 이름 부분에서만 작동하도록하는 것입니다. 정규식 ([^/]*\Z)은를 포함하지 않는 경로의 마지막 부분과 일치합니다 /.

find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +

zsh 는 이름을 바꾸는 데보다 편리한 기능을 제공합니다. Perl보다 훨씬 더 비밀 스럽지만 구성하기가 더 쉬우 며 종종 더 쉽습니다.

이 함수 zmv는 패턴을 기반으로 파일 이름을 바꿉니다. autoload -U zmv한 번 실행 하여 활성화하십시오 (이 줄을에 넣으십시오 .zshrc).

첫 번째 인수 zmv(대체 패턴)에서 zsh의 강력한 와일드 카드 패턴을 사용할 수 있습니다 . zmv(대체 텍스트)에 대한 두 번째 인수에서 히스토리 수정자를 포함한 매개 변수 확장 기능을 사용할 수 있습니다 .

zmv -w '**/*' '$1$2:u'

설명:

  • -w — 각 와일드 카드 패턴에 숫자 변수를 자동 할당
  • **/*— 하위 디렉토리의 모든 파일을 재귀 적으로 ( **/0, 1 개 이상의 하위 디렉토리 레벨과 일치)
  • $1 — 각 경로의 디렉토리 부분과 일치하는 첫 번째 숫자 변수
  • $2:u— 두 번째 숫자 변수 (여기서는 각 경로의 기본 이름 부분과 일치 :u하며 값을 대문자로 변환하는 수정 자 포함)

또한 보너스로 주변 로케일 설정을 존중합니다.

zmv작성한 명령 에 대해 잘 모를 -n경우 명령이 수행 한 작업을 인쇄하고 변경하지 않는 옵션을 전달할 수 있습니다 . 출력을 확인하고 원하는 작업을 수행하면 -n실제로 작동 하지 않고 명령을 다시 실행하십시오 .


답변

질에서 (사소한 편집 포함) 도난 게시 여기

find <DIR> -depth -type d -exec rename -n 's!/([^/]*/?)$!\U/$1!' {} +


답변

이 답변에 아직 연결되어있는 사람에게 Guiles Quernot이 요구하지 않은이 질문에 대한 탁월한 답변을 알려 드리고자합니다 find.

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

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

그러나 실행하기 전에 이전 bash 버전과 관련된 경고에 대한 링크를 읽으십시오.

마지막으로 누군가 y///명령이 무엇을하는지 궁금해하는 경우 perl regex. 관련 문서에 대한 링크는 다음과 같습니다 .


답변

find -execdir| 이름 바꾸기

Perl 정규식 fu가 기본 이름으로 만 행동하는 것을 피하기 때문에 상대 경로 광기가 아닌 경우이를 수행하는 가장 좋은 방법입니다.

PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
  find a -depth -execdir rename 's/(.*)/\U$1/' '{}' \;

-execdir처음 cd에만 기본 이름에 실행하기 전에 디렉토리에이야.

불행히도, 나는 그 PATH해킹 부분을 제거 할 수 없으며 find -execdir상대 경로가 있다면 아무것도하지 않습니다 PATH: /ubuntu/621132/why-using-the-execdir-action- 경로에있는 디렉토리의 안전하지 않은 보안 / 1109378


답변

파일 이름을 바꾸려는 디렉토리로 이동 한 후 시도하십시오.

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