ファイル名を一括して先頭 10 文字に短くする (重複があっても大丈夫)

ファイル名を10文字にする関数(重複があっても大丈夫) - みずぴー日記にインスパイヤされて、前回のAWK Users JP :: ファイル名を一括して先頭 10 文字に短くするを改良してみました。 重複する場合には連番を付けます。

awk でファイルの有無を調べるには getline を使います。 これは既にAWK Users JP :: which コマンドの実装でも使っている技のひとつです。 ここでは while 文で重複がなくなるまでループして連番を付けていきます。

#! /usr/local/bin/nawk -f
# rename_file_2.awk
# ファイル名を一括して先頭 10 文字に短くする
# usage: nawk -f rename_file_2.awk file [...]

BEGIN {
    for (i = 1; i < ARGC; i++) {
        from_file = ARGV[i];
        to_file   = substr(from_file, 1, 10);
        idx = 0;
        while (getline < to_file >= 0) {
            idx++;
            to_file = substr(from_file, 1, 10) "_" sprintf("%02d", idx);
            close(to_file);
        }
        close(to_file);
        system("mv " from_file " " to_file);
    }
}

少し意地悪な例にしてみましょう。

$ touch _1234567890  _1234567891  _1234567892  _1234567893  _123456789 _abcdefghijklm

$ ls _*
_1234567890  _abcdefghijklm  _1234567893  _1234567892  _1234567891  _123456789

$ gawk -f rename_file_2.awk _*

$ ls _*
_123456789_02  _123456789_05  _123456789_03
_abcdefghi     _123456789_04  _123456789_01

このように連番で変換されました。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png