Windows에서 파일 이름이 대문자와 소문자인 폴더와 파일을 분리합니다.

Windows에서 파일 이름이 대문자와 소문자인 폴더와 파일을 분리합니다.

Windows 시스템에 대문자와 소문자 파일 이름이 있는 파일 폴더가 있습니다.

"a" 또는 "A"로 시작하는 파일 이름의 경우 "A" 또는 "a" 폴더에 저장됩니다. "b" 또는 "B"로 시작하는 모든 파일 이름은 "B" 또는 "b" 폴더에 저장됩니다. 등

현재 폴더 이름은 임의의 대문자 "A" 또는 소문자 "a"일 수 있습니다.

이제 내 임무는 이러한 폴더와 파일을 Linux로 이동하고 케이스 디렉터리 이름과 파일 이름을 기반으로 파일을 다른 폴더로 분리하는 것입니다. (예를 들어 atF0Gxx 파일은 "a" 폴더 아래에 있고 A0p9xxx 파일은 "A" 폴더 아래에 있으며 b, B, c, C, d, D...z, Z도 마찬가지입니다)

각 파일과 폴더에 대해 수동으로 수행하지 않고 해결 방법이 있습니까?

대문자와 소문자 파일 이름이 혼합된 파일

답변1

그리고 zsh:

autoload -Uz zmv
mkdir -p {a..z} {A..Z}
zmv '[a-zA-Z]/(([a-zA-Z])*)' '$2/$1'

mv -- x/Xwhatever X/Xwhatevermv이미 올바른 디렉터리에 있는 파일에 대한 호출을 건너뛰고 각 파일에 대해 실행됩니다 . 실제로 실행하지 않고도 수행할 작업을 확인할 수 -n있는 옵션 을 추가하세요 .zmv

답변2

우아하지는 않지만 zmv간단한 for-loop로 충분합니다.

#!/bin/bash
for letter in {a..z} {A..Z} ; do
  mkdir /path/to/dest/$letter
  mv /path/to/source/*/${letter}?* /path/to/dest/$letter
done

답변3

실제로 존재하는 문자와 숫자에 대해서만 반복하는 약간 더 효율적인 버전:

for file in *; do
    if [[ ! -d "$file" ]]; then
        firstLetter=${file:0:1}
        mkdir -p "$firstLetter"
        mv -- "$file" "$firstLetter"/
    fi
done 

그러나 다음과 같은 경우문서디렉터리 중 하나와 동일한 이름입니다. 예를 들어, 이름이 지정된 파일 a로는 이름이 같은 디렉터리를 생성할 수 없습니다 a. 이 문제를 해결하려면 다음을 수행할 수 있습니다.

tmpDir=$(mktemp -p "." -d)
for file in *; do
    if [[ ! -d "$file" ]]; then
      firstLetter=${file:0:1};
      ## If a file exists with this name
      if [[ -e "$firstLetter" && ! -d "$firstLetter" ]]; then
        ## move the file to the tmp dir and update the value
        ## of the $file variable to point to it
        mv -- "$file" "$tmpDir"
        file="$tmpDir/$file"
      fi
      mkdir -p "$firstLetter";
      mv -- "$file" "$firstLetter"/;
    fi
done
# $tmpDir should be empty by now
rmdir "$tmpDir"

관련 정보