zshとperlでディレクトリ下のファイルを一括編集する

カレントディレクトリの下に複数のディレクトリがあり、それぞれのディレクトリ内にある規則に沿って編集を加えたい時は、手作業ではなくコマンドラインを使って行ったほうが確実にミスなく行うことができる。

今回は、macOSにおいてターミナルを使って、その作業を行う手順を紹介する。

スポンサーリンク
レクタングル(大)

各ディレクトリ内のファイルの特定行を規則に従って更新したい

たとえば、以下のようなファイル・ディレクトリ構造を考えてみよう。

$ tree
.
├── 0
│   └── hoge.yaml
├── 1
│   └── hoge.yaml
├── 2
│   └── hoge.yaml
├── 3
│   └── hoge.yaml
├── 4
│   └── hoge.yaml
├── 5
│   └── hoge.yaml
├── 6
│   └── hoge.yaml
├── 7
│   └── hoge.yaml
├── 8
│   └── hoge.yaml
└── 9
    └── hoge.yaml

hoge.yamlは以下のような内容だとする。

directory: 0

この時、各hoge.yamlのdirectoryキーの値 “0” を、各ディレクトリ名で更新したい場合、どうしたら良いだろうか?

zshによるループ処理

これは、以下のように、perlのone liner (ワンライナー)による文字列置換をzshによる繰り返し処理に組み込んで行えば良い。

for i in {0..9}
do
	echo $i
	perl -pi -e "s/1/${i}/" ${i}/hoge.yaml
done

意味を解説すると、zshの繰り返しはfor文により行っており、0から9まで順に10回繰り返すことを示す。

また、0から9の値は “i” という変数に入れられ、これは “$i” もしくは “${i}” という形で参照することができる。

perlワンライナーによる置換

次に、実際の置換はperlコマンドで行っており、各オプションの意味は以下の通りである。

  • -p : ファイルから1行ずつ読み込んで処理する
  • -i : 読み込んだ内容をそのまま編集して書き込む (in placeで処理する)
  • -e : ワンラインプログラムとして実行する

なお、perlで置換をする場合は “s” という置換用演算子を使い、”s/A/B/” とすると、Aという文字列をBという文字列で置換するという意味になる。

なので、上記コマンドは順に

  • 0/hoge.yamlを読み込み、”0″ を “0” で置換する
  • 1/hoge.yamlを読み込み、”0″ を “1” で置換する
  • 2/hoge.yamlを読み込み、”0″ を “2” で置換する
  • 9/hoge.yamlを読み込み、”0″ を “9” で置換する

という意味になる。

結果

ファイルの内容を参照してみると、確かに置換されていることが分かる。

$ cat 0/hoge.yaml
directory: 0
$ cat 1/hoge.yaml
directory: 1
$ cat 2/hoge.yaml
directory: 2
...
$ cat 9/hoge.yaml
directory: 9
スポンサーリンク
レクタングル(大)
レクタングル(大)
  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。