それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

linux でファイル名に連番を付加して整理する。

コマンドで、ファイルに番号をつけたい。

なんか適当にファイルをつくちゃってて、ちょっと整理が大変なとき。

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 と組み合わせるという、シンプルなプログラムとパイプだけで事足りる。