find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
여기에 언급 된보다 정교한 스크립트를 시도하지 않았지만 Synology NAS에서 단일 명령 줄 버전 중 어느 것도 나를 위해 작동하지 않았습니다. rename
를 사용할 수 없으며 find
이미 이름이 바뀐 경로의 이전 이름을 고수하는 것처럼 보이기 때문에 실패의 많은 변형이 있습니다 (예 :이 ./FOO
뒤에 오는 경우 경로 ./FOO/BAR
이름 이 더 이상 유효하지 않더라도 이름 바꾸기 ./FOO
가 ./foo
계속 나열 됨 ./FOO/BAR
) . 위의 명령은 아무런 문제없이 나를 위해 일했습니다.
다음은 명령의 각 부분에 대한 설명입니다.
find . -depth -name '*[A-Z]*'
.
깊이 우선 검색을 사용하여 현재 디렉토리에서 파일 을 처리하고 (처리하려는 디렉토리로 변경 ) (예 : ./foo/bar
이전에 나열 됨 ./foo
) 대문자가 포함 된 파일 만 찾습니다. -name
필터는 기본 파일 이름이 아닌 전체 경로에 적용됩니다. 따라서이 목록은 표시 ./FOO/BAR
되지만 그렇지는 않습니다 ./FOO/bar
. 이름을 바꾸고 싶지 않기 때문에 괜찮습니다 ./FOO/bar
. 우리는 이름을 바꾸고 ./FOO
싶지만 나중에 나열됩니다 (이것이 -depth
중요한 이유 입니다).
이 comand 자체는 특히 이름을 바꾸려는 파일을 찾는 데 특히 유용합니다. 파일 이름 충돌 또는 오류로 인해 여전히 교체되지 않은 파일을 검색하려면 complete rename 명령 뒤에 이것을 사용하십시오.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
이 부분은 출력 된 파일을 읽고 정규식을 사용하여 명령으로 find
형식화합니다 mv
. 이 -n
옵션 sed
은 입력 인쇄를 중지 p
하고 검색 및 바꾸기 정규식 의 명령이 대체 된 텍스트를 출력합니다.
정규 표현식 자체는 마지막 / (파일의 디렉토리 인)까지의 부분과 파일 이름 자체의 두 가지 캡처로 구성됩니다. 디렉토리는 그대로 남아 있지만 파일 이름은 소문자로 변환됩니다. 따라서 find
출력 ./FOO/BAR
되면이됩니다 mv -n -v -T ./FOO/BAR ./FOO/bar
. -n
의 옵션을 mv
확인 소문자 파일을 기존 차종은 덮어 쓰지 않습니다. 이 -v
옵션은 mv
모든 변경 사항을 출력합니다 (또는 ./FOO/bar
존재 하지 않는 경우- 이미 존재 ./FOO/BAR -> ./FOO/BAR
하는 경우 변경 사항이 없음을 나타내는 것과 같은 것을 출력합니다 ). 는 -T
여기 매우 중요하다 -이 디렉토리로 대상 파일을 처리합니다. 그러면 해당 디렉토리가 존재하는 경우 ./FOO/BAR
이동되지 ./FOO/bar
않습니다.
이것을 함께 사용 find
하여 실행될 명령 목록을 생성하십시오 (실제로 수행하지 않고 수행 할 작업을 확인하는 데 편리함)
sh
이것은 매우 설명이 필요합니다. 생성 된 모든 mv
명령을 쉘 인터프리터로 라우팅합니다 . bash
원하는대로 또는 원하는대로 바꿀 수 있습니다 .
ABCdef
,abcDEF
및aBcDeF
? 와 같이 대소 문자 만 다른 동일한 수준 이름 바꾸기 스크립트가 중단되거나 경고하고 계속해야합니까? 2. US-ASCII 이외의 이름에 대해 소문자를 어떻게 정의합니까? 그러한 이름이 존재할 수있는 경우 먼저 한 번의 확인 및 제외 단계를 수행해야합니까? 3. 이름 변경 작업을 실행중인 경우