Code-golfed und doch lesbar mit nur zwei Befehlen und zwei regulären Ausdrücken:
mkdir -p '#' {a..z}
prename -n 's|^[[:alpha:]]|\l$&/$&|; s|^[0-9]|#/$&|' [[:alnum:]]?*
Wenn Sie eine große Anzahl von Dateien verschieben müssen, zu viele, um in die Prozessargumentliste zu passen (ja, es gibt ein Limit und es können nur einige Kilobyte sein), können Sie die Dateiliste mit einem anderen Befehl generieren und diese an weiterleiten prename
, z.B:
find -mindepth 1 -maxdepth 1 -name '[[:alnum:]]?*' -printf '%f\n' |
prename -n 's|^[[:alpha:]]|\l$&/$&|; s|^[0-9]|#/$&|'
Dies hat den zusätzlichen Vorteil, dass der Literaldateiname nicht verschoben wird, [[:alnum:]]?*
wenn keine Dateien mit dem Glob-Muster übereinstimmen. find
erlaubt auch viel mehr Übereinstimmungskriterien als Shell-Globbing. Eine Alternative besteht darin, die nullglob
Shell-Option festzulegen und den Standardeingabestream von zu schließen prename
. 1
Entfernen Sie in beiden Fällen den -n
Schalter, um die Dateien tatsächlich zu verschieben, und zeigen Sie nicht nur, wie sie verschoben würden.
Nachtrag: Sie können die leeren Verzeichnisse wieder entfernen mit:
rmdir --ignore-fail-on-non-empty '#' {a..z}
1 shopt -s nullglob; prename ... <&-