Простой комбинации 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
, то вы можете проверить существование каталога явно, например. g.
for f in *; do d="${f:0:2}"; [[ -d "$d" ]] || mkdir "$d"; mv -t "$d" -- "$f"; done
Использование /opt
было бы хорошим вариантом в большинстве Unix, которые не используют его ни для чего другого.
FreeBSD не будет использовать /opt
в своей базовой системе и использует /usr/local
для своих пакетов.
См. также раздел «Структура каталогов» в справочнике FreeBSD (где /opt
вообще не упоминается).