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/Xwhatever
mv
이미 올바른 디렉터리에 있는 파일에 대한 호출을 건너뛰고 각 파일에 대해 실행됩니다 . 실제로 실행하지 않고도 수행할 작업을 확인할 수 -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"