ファイルの一括処理

ある程度すでに規則に沿って命名されたファイルに対して、リネームなど一括で行うには。

# foo から始まるファイルを bar から始まるようにする
for fn in foo*
do
  mv "'$fn'" `echo "'$fn'" | sed -e "s/foo/bar/"`
done

# *.jpeg を *.jpg にする
for fn in *.jpeg
do
  mv "'$fn'" "'${fn%.jpeg}.jpg'"
done

UNIX & Linux コマンド・シェルスクリプト リファレンスの方は for fn in `ls -1 *` を薦めており、最初はそれを使っていましたが、空白が含まれるファイルを複数として認識してしまうみたいなので for fn in * を利用することにしました。後者は空白が含まれていても一つのファイルとしてみなすようです。

sed の使い方

正規表現を利用しての置換などで便利な sed を特定の文字列に対して使うには echo を利用するといいようです。

sed -e "s/foo/bar/" input.txt     # ファイルから
sed -e "s/foo/bar/"               # 標準入力から
echo "text" | sed -e "s/foo/bar/" # echo の結果から

文字列変数に対して、文字列の切り取り

拡張子の取り除きは ${path%.*} で行うことができる。

echo ${variable#pattern}  # 前方から最短一致した部分を切り取る
echo ${variable##pattern} # 前方から最長一致した部分を切り取る
echo ${variable%pattern}  # 後方から最短一致した部分を切り取る
echo ${variable%%pattern} # 後方から最長一致した部分を切り取る

ほかにも、 basename で拡張子を削除できる。