UNTITLED MEMORANDUM

あまり知られていないこと

【まとめ】Shell Scriptでファイル名一括編集

以前の記事のShell Script版を書こうと思ったのですが,
こちらは結構まとまった記事があるようです(参考記事).

これらの記事を参考に,バッチファイルの記事と対応させたShell Scriptの例を作ってみます.

ファイル名切り出し

例1:拡張子".txt"のファイルの3〜5文字目を抜き出す① (abcdefg.txt→cde.txt)
#!/bin/sh
dir=作業ディレクトリのpath
cd $dir
for file in *.txt
do
    After=`echo $file | cut -c 3-5`
    mv "${file}" "${After}.txt"
done

ここで,

  1. $変数, ${変数}:変数の値参照
  2. $(コマンド), `コマンド`:コマンド置換
  3. ファイルを上書きする際に問い合わせるようにするには "mv -i" とします.


例2:拡張子".txt"のファイルの3〜5文字目を抜き出す② (abcdefg.txt→cde.txt)
#!/bin/sh
dir=作業ディレクトリのpath
cd $dir
for file in *.txt
do
    After="${file:2:3}"
    extension="${file##*.}"
    mv "${file}" "${After}.${extension}"
done

ここで,

  1. ${変数:数字1:数字2}:変数の"数字1"より後の"数字2"文字を出力.
  2. ${変数##ワード}:変数の頭から"ワード"にマッチする部分を取り除いた文字列を出力
    (最大マッチ,#に変えれば最小マッチ)

文頭/末尾への文字列付加

ファイル名の文頭に"P-"を,末尾に"-S"を追加する(abc.txt→P-abc-S.txt)

#!/bin/sh
Prefix=P-
Suffix=-S
dir=作業ディレクトリのpath
cd $dir
for file in *.txt
do
    filename="${file%.*}"
    extension="${file##*.}"
    mv "${file}" "${Prefix}${filename}${Suffix}.${extension}"
done

ここで,

  1. ${変数%ワード}:変数末尾から"ワード"にマッチする部分を取り除いた文字列を出力
    (最小マッチ,%%に変えれば最大マッチ)
  2. ${変数##ワード}:変数の頭から"ワード"にマッチする部分を取り除いた文字列を出力
    (最大マッチ,#に変えれば最小マッチ)