디렉토리에 있는 파일 이름의 대문자를 소문자로 변경하는 명령은 무엇입니까? 감사해요
파일이 있습니다
F1
F2
FILE1
FILE2
이름을 바꾸고 싶습니다.
f1
f2
file1
file2
답변1
현재 디렉터리의 모든(숨겨지지 않은) 파일에 대해
zsh
셸 에서는 다음을 수행할 수 있습니다.
autoload zmv # best in ~/.zshrc
zmv '*' '${(L)f}'
( zmv
이름을 바꾸기 전에 충돌(예: 현재 디렉터리의 파일과 파일)이 있으면 중단합니다 FILE
.File
( 디렉터리가 아닌 파일만 이름을 바꾸 *
도록 변경하거나, 심볼릭 링크 확인 후 디렉터리가 아닌 파일의 이름을 바꾸도록 변경)*(#q^/)
*(#q-^/)
그리고 mmv
:
mmv '*' '#l1'
( 이 옵션을 전달 mmv
하지 않으면 디렉토리(디렉토리에 대한 심볼릭 링크도 아님)의 이름이 바뀌지 않습니다 .)-r
Perl의 rename
유틸리티 또는 그 변형(때때로 라고 함 prename
)을 사용하십시오.
rename '$_ = lc $_' ./*
zmv
, mmv
()의 일부 변형은 선택적으로 rename
가능합니다 .-n
시운전그리고-v
말 수가 많은수행 중인 작업을 표시하는 옵션입니다.
일부 변형은 rename
ASCII 문자만 번역합니다. 예를 들어 다른 것들은 mmv
로케일에 관계없이 입력을 UTF-8로 처리합니다. zmv
아래의 다른 방법과 마찬가지로 로케일에 따라 올바르게 번역됩니다.
bash
셸 에서 :
for f in *[[:upper:]]*; do
# [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
# [ -L "$f" ] && continue # uncomment to also skip symlinks even
# if they resolve to regular files
mv -i -- "$f" "${f,,}"
done
( -i
파일을 덮어쓰기 전에 요청했지만 이름을 바꿀 때마다 일부 mv
구현에서는 지원합니다 .-v
말 수가 많은수행 중인 작업을 표시하는 옵션입니다. GNU 구현에는 -T
옵션이 있는데, 여기서도 사용하고 싶은 옵션이 있습니다 mv FOO foo
.FOO를 foo 디렉터리로 이동합니다.foo
현재 디렉토리에 디렉토리가 있는 경우).
ksh
in zsh
및 쉘 bash
:
typeset -l f
for F in *[[:upper:]]*; do
# [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
# [ -L "$f" ] && continue # uncomment to also skip symlinks even
# if they resolve to regular files
f=$F
mv -i -- "$F" "$f"
done
( pdksh
파생품은 ASCII 문자만 번역하지만)
POSIXly(파일 이름이 개행 문자로 끝나지 않는다고 가정):
tolower() {
awk 'BEGIN{print tolower(ARGV[1])}' "$1"
}
for f in *[[:upper:]]*; do
# [ -f "$f" ] || continue # uncomment to skip non-regular files if needed
# [ -L "$f" ] && continue # uncomment to also skip symlinks even
# if they resolve to regular files
mv -i -- "$f" "$(tolower "$f")"
done
일부 awk
구현에서는 mawk
ASCII 문자만 변환합니다.
재귀(하위 디렉터리의 파일 이름도 바꿈)
(해야 할 일과 하지 말아야 할 일에 관한 이전 섹션을 읽어보는 것이 좋습니다. 대부분의 내용은 여기에도 적용됩니다.)
zsh zmv
:
zmv '(**/)(*)' '$1${(L)2}'
파일 수가 많은 경우 zmodload zsh/files
미리 실행하여 작업 속도를 높일 수 있습니다. 그러면 내장 버전이 활성화됩니다 mv
( zmv
실제로 이름 바꾸기를 수행하기 위해).
mmv
(디렉토리가 아닌 경우에만 이름 바꾸기):
mmv ';*' '#1#l2'
find
및 perl
's 사용 rename
(숨겨진 파일과 숨겨진 디렉토리에 있는 파일의 이름도 바꿈):
find . -depth -name '*[[:upper:]]*' -exec rename '
s:[^/]+\Z:\L$&:' {} +
POSIXly(숨겨진 파일과 숨겨진 디렉터리의 파일 이름도 바꿈):
find . -depth -name '*[[:upper:]]*' -exec sh -c '
for f do
dir=${f%/*}
name=${f##*/}
newname=$(awk "BEGIN{print tolower(ARGV[1])}" "$name")
mv -i -- "$f" "$dir/$newname"
done' sh {} +
답변2
대안은 를 사용하는 것입니다 rename - Perl extension for renaming multiple files
.
모든 파일 이름을 소문자로 변환하려면:rename 'y/A-Z/a-z/' *
설치하지 않으려면 다음을 수행할 수 있습니다.
for item in *; do
mv "$item" "${item,,}"
done