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