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


11

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

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

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

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

에서 온 것 man rename입니다.


rename 명령에 대해 알지 못하면 시도 rename 'y/a-z/A-Z/' *하면 원하는 것을 얻을 수 있다고 생각합니다 . 테스트 할 때주의하십시오.
Warwick

그것은 (초기 적이 지 않았기 때문에) 재귀 적이 지 않지만 작동합니다. 나는 왜 내가 그 자체로 힘들지 않았는지 이해할 수 없다 :), 멍청 아!
jnhghy-Alexandru Jantea

나는 Gilles의 대답의 질을 감안할 때 내 대답보다 그의 대답을 받아들이면 좋을 것이라고 생각합니다. 그것은 내 것보다 훨씬 완전하며 옵션과 모든 작동 방식을 설명합니다. 감사.
Warwick

답변:


8

데비안과 파생어 (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실제로 작동 하지 않고 명령을 다시 실행하십시오 .


5

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

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


이것은 재귀 적으로 작동하지 않습니다.
Gilles 'SO- 악한 중지'

진실. 질문을 제대로 읽었어야 했어요. 이름 바꾸기 명령에 액세스 할 수는 없지만 이것이 재귀 적으로 작동한다고 생각합니다. –find <dir> -exec rename 'y/a-z/A-Z/' {} \;
Warwick

find재귀 하는 동안 디렉토리의 이름을 바꾸고 있기 때문에 그보다 조금 더 복잡 합니다.
Gilles 'SO- 악한 중지'

@ 질-좋아. 약간의 연구를 한 후에 디렉토리 이름이 마지막으로 처리되도록 찾기 위해 -depth 옵션을 추가해야합니다. 따라서 find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;이름 바꾸기 디렉토리 문제를 처리해야합니다. 옳은?
Warwick

아니, 아직도 있기 때문에,하지 작업을 수행 rename변경 예 foo/barFOO/BAR하고 FOO그 시점에서 존재하지 않습니다.
Gilles 'SO- 악한 중지'

2

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

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

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

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

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


1

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


0

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

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

ls의 출력을 구문 분석하지 말고 왜 지구상 ls -l에서 이름 이외의 열을 잘라 내기 위해 실행 합니까?) 변수 대체에 큰 따옴표를 사용하십시오 . 코드가 너무 복잡하여 공백 및 기타 특수 문자가 포함 된 파일 이름이 손상됩니다. find또는 **/하위 디렉토리로 재귀를 사용하려면 출력은 ls사람이 소비하는 것입니다.
Gilles 'SO- 악 그만해라'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.