ファイル名を一括して先頭 10 文字に短くする

ファイル名を一括して先頭10文字に短くするバッチ - バッチもん研究所 blog からインスパイヤーされていますが、awk を使っても構わないということなので、awk でやってみます。 ただし、Windows を使っていないので、Windows のコマンドを忘れてしまっているため、ここでは Linux (Unix 系 OS) を前提に進めます。

最初に手でサンプルを作るのが結構面倒な上にディレクトリにサンプルファイルが大量にあふれる事態になりそうなので、以下のようなスクリプトを作成しました。

#! /usr/local/bin/nawk -f
# make_sample.awk
# 21 文字のランダムなファイル名を作成する
# usage: nawk -f make_sample.awk [num]

BEGIN {
    num = ARGV[1] ? ARGV[1] : 10;

    for (i = 1; i <= num; i++) {

        file_name = "";                     # 初期化

        for (j = 1; j <= 20; j++) {
            file_name = file_name sprintf("%c", int(rand() * 26) + 65);
        }

        file_name = "_" file_name;          # 目印
        system("touch " file_name);
    }
}

このサンプルで一気に 10 個の 21 文字のファイルを作成します。 後で削除する際に目印になるようにファイル名の先頭にはアンダースコアをつけるようにしています。

実行してみます。

$ gawk -f make_sample.awk

$ ls
../                    _IFZESNYSCFOSCNFHQLBM  _IOLWQNXVQMKAPYJGKGZM
rename_file.awk        _CAEKRNRHMHLYCLYWDAGW  _RUWHPSDTJEQQOFYXLQYT
make_sample.awk        _LUWJYUVYPPIKXEVTMFDB  _TBYITPOOSGMGSLQDBXWG
_GHVDPFVEMDJMXGXFQOIC  _LICLQQUMZYQTYNFHVAHX  ./
_NOWBCQASCMGRXTSXYJXU  _JKWYZDOGULTFMYWYKIFI

さて、先頭にアンダースコアのあるファイルを 10 文字にします。

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

BEGIN {
    for (i = 1; i < ARGC; i++) {
        system("mv " ARGV[i] " " substr(ARGV[i], 1, 10));
    }
}

これを実行すればいいわけです。

$ gawk -f rename_file.awk _*

$ ls
../              _GHVDPFVEM  _CAEKRNRHM  _JKWYZDOGU  _TBYITPOOS
rename_file.awk  _NOWBCQASC  _LUWJYUVYP  _IOLWQNXVQ  ./
make_sample.awk  _IFZESNYSC  _LICLQQUMZ  _RUWHPSDTJ

10 文字に変更されました。

awk だと他のコマンドに頼らなければならないのですが、実際のコアの部分は非常に小さなプログラムで記述することができます。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png