모든 파일을 파일 이름으로 시작하는 하위 디렉터리로 이동합니다.

모든 파일을 파일 이름으로 시작하는 하위 디렉터리로 이동합니다.

8개의 임의의 문자, 숫자, _ 및 -로 구성된 이름을 가진 꽤 많은 파일이 포함된 디렉토리가 있습니다. 예를 들면 다음과 같습니다.

0dckGYH5.jpg
32Pz5-WQ.png
32_17pxH.png
Hsf4BQW9.jpg
xh-fa3Nu.gif
zYtBEaKA.png
...

이제 작업은 각 파일을 반복하고, 파일 이름의 처음 2자로 명명된 디렉터리를 만들고, 파일을 해당 디렉터리로 이동하는 것입니다.

최종 구조는 다음과 같아야 합니다.

0d
└── 0dckGYH5.jpg
32
├── 32Pz5-WQ.png
└── 32_17pxH.png
Hs
└── Hsf4BQW9.jpg
xh
└── xh-fa3Nu.gif
zY
└── zYtBEaKA.png

시스템에 아무것도 설치할 수 있는 권한이 없는데 어떻게 기본 셸 명령만 사용하여 이를 수행할 수 있습니까?

답변1

mkdir -p와 의 간단한 조합이면 mv충분합니다

for f in *; do d="${f:0:2}"; mkdir -p "$d"; mv -t "$d" -- "$f"; done

전시하다:

$ ls
0dckGYH5.jpg  32_17pxH.png  32Pz5-WQ.png  Hsf4BQW9.jpg  xh-fa3Nu.gif  zYtBEaKA.png

$ for f in *; do d="${f:0:2}"; mkdir -p "$d"; mv -t "$d" -- "$f"; done

$ tree .
.
├── 0d
│   └── 0dckGYH5.jpg
├── 32
│   ├── 32_17pxH.png
│   └── 32Pz5-WQ.png
├── Hs
│   └── Hsf4BQW9.jpg
├── xh
│   └── xh-fa3Nu.gif
└── zY
    └── zYtBEaKA.png

5 directories, 6 files

사용 중인 시스템 버전에 mkdir이 옵션이 없으면 -p디렉터리가 존재하는지 명시적으로 테스트할 수 있습니다.

 for f in *; do d="${f:0:2}"; [[ -d "$d" ]] || mkdir "$d"; mv -t "$d" -- "$f"; done

관련 정보