모든 파일과 폴더 (하위 폴더)를 재귀 적으로 대문자로 바꾸고 싶습니다.
소문자로 처리 할 스크립트를 찾았지만 변경 방법을 모르므로 다른 방법으로 (아래에서 위) 수행합니다.
내가 발견하고 소문자로 작동하지만 수정하는 방법을 몰랐던 스크립트는 다음과 같습니다.
rename 'y/A-Z/a-z/' *
에서 온 것 man rename
입니다.
모든 파일과 폴더 (하위 폴더)를 재귀 적으로 대문자로 바꾸고 싶습니다.
소문자로 처리 할 스크립트를 찾았지만 변경 방법을 모르므로 다른 방법으로 (아래에서 위) 수행합니다.
내가 발견하고 소문자로 작동하지만 수정하는 방법을 몰랐던 스크립트는 다음과 같습니다.
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!' {} +
find <dir> -exec rename 'y/a-z/A-Z/' {} \;
find
재귀 하는 동안 디렉토리의 이름을 바꾸고 있기 때문에 그보다 조금 더 복잡 합니다.
find <dir> -depth -exec rename 'y/a-z/A-Z/' {} \;
이름 바꾸기 디렉토리 문제를 처리해야합니다. 옳은?
rename
변경 예 foo/bar
로 FOO/BAR
하고 FOO
그 시점에서 존재하지 않습니다.
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
ls -l
에서 이름 이외의 열을 잘라 내기 위해 실행 합니까?) 변수 대체에 큰 따옴표를 사용하십시오 . 코드가 너무 복잡하여 공백 및 기타 특수 문자가 포함 된 파일 이름이 손상됩니다. find
또는 **/
하위 디렉토리로 재귀를 사용하려면 출력은 ls
사람이 소비하는 것입니다.
rename 'y/a-z/A-Z/' *
하면 원하는 것을 얻을 수 있다고 생각합니다 . 테스트 할 때주의하십시오.