コマンドで、ファイルに番号をつけたい。
なんか適当にファイルをつくちゃってて、ちょっと整理が大変なとき。
ls -l total 0 -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 aeja6 -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 aen4b -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 au5ph -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 deet8 -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 ee1th -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 eet3h -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 icei2 -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 li8do -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 pus4h -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 ush1u
ファイル名をインデックス付き変えたい。
ファイル名に連番をつけるのは面倒なので nl で処理
$ ls *| nl 1 aeja6 2 aen4b 3 au5ph 4 deet8 5 ee1th 6 eet3h 7 icei2 8 li8do 9 pus4h 10 ush1u
この結果をAWKにかける。
ls *| nl | awk '{ printf "mv %s %02d-%s.txt \n", $2, $1, $2 }' mv aeja6 01-aeja6.txt mv aen4b 02-aen4b.txt mv au5ph 03-au5ph.txt mv deet8 04-deet8.txt mv ee1th 05-ee1th.txt mv eet3h 06-eet3h.txt mv icei2 07-icei2.txt mv li8do 08-li8do.txt mv pus4h 09-pus4h.txt mv ush1u 10-ush1u.txt
作ったコマンドを bash に実行させる (eval するならSTDINに流すだけ)
| bash
を追加してawk の結果を実行する。
ls *| nl | awk '{ printf "mv %s %02d-%s.txt \n", $2, $1, $2 }' | bash
結果
ls -l total 0 -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 01-aeja6.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 02-aen4b.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 03-au5ph.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 04-deet8.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 05-ee1th.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 06-eet3h.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 07-icei2.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 08-li8do.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 09-pus4h.txt -rwxrwxrwx 1 takuya takuya 0 Aug 3 16:34 10-ush1u.txt
連番がつく。
ファイル名に気をつけてても、ファイルに連番をつけたほうが確実にソートできるので嬉しい。
またファイル名の規則を整えたほうが、ファイルを一覧したときに使いやすい。
連番をつけるなら、nl をつかってawk と組み合わせるという、シンプルなプログラムとパイプだけで事足りる。