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. find
pozwala również na wiele więcej kryteriów dopasowania niż globowanie powłoki. Alternatywą jest ustawienie nullglob
opcji powłoki i zamknięcie standardowego strumienia wejściowego prename
. 1
W obu przypadkach usuń -n
przełą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 ... <&-