Gra w golfa, ale czytelny za pomocą tylko dwóch poleceń i dwóch wyrażeń regularnych:
mkdir -p '#' {a..z}
prename -n 's|^[[:alpha:]]|\l$&/$&|; s|^[0-9]|#/$&|' [[:alnum:]]?*
Jeśli masz dużą liczbę plików do przeniesienia, zbyt wiele, aby zmieściły się na liście argumentów procesu (tak, istnieje limit i może to być zaledwie kilka kilobajtów), możesz wygenerować listę plików za pomocą innego polecenia i potoku, aby prename, np .:
find -mindepth 1 -maxdepth 1 -name '[[:alnum:]]?*' -printf '%f\n' |
prename -n 's|^[[:alpha:]]|\l$&/$&|; s|^[0-9]|#/$&|'
Ma to tę dodatkową zaletę, że nie próbuje przenieść literalnej nazwy pliku, [[:alnum:]]?*jeśli żaden plik nie pasuje do wzorca globu. findpozwala również na wiele więcej kryteriów dopasowania niż globowanie powłoki. Alternatywą jest ustawienie nullglobopcji powłoki i zamknięcie standardowego strumienia wejściowego prename. 1
W obu przypadkach usuń -nprzełącznik, aby faktycznie przenieść pliki, a nie tylko pokazać, jak zostaną przeniesione.
Dodatek: Możesz ponownie usunąć puste katalogi za pomocą:
rmdir --ignore-fail-on-non-empty '#' {a..z}
1 shopt -s nullglob; prename ... <&-