はじめに
昨年後半から仕事が忙しく、ブログ投稿を行っていました。 些細なネタでもいいので毎日続けることが大事だと反省しました。
というのも、投稿を怠っていた間もブログを見てくれた方、訪問数、いいねの数が伸び続け、 月間の訪問者数もついに 5万PV/月 となっていたためです !
ありがとうございます。
今年一発目の投稿は多くの人がご存知の一発ネタですね。 Bashで特定のフォルダ配下にあるファイルの名前を一括置換する方法です。
検証環境
| |
準備
適当なファイルとフォルダを作ります。
| |
“file- -005.txt"だけ、ファイル名にスペースを含んでいることに注意です。
フォルダ構成を確認してみます。
| |
一括置換を行う
find コマンドで実行した結果をループで読み込み mv しましょう。
| |
詳しい解説は後述します!
結果
結果を確認すると、正しくファイル名が一括置換されていることがわかります。
# 結果を確認
$ tree -f
.
|-- ./dir1
| `-- ./dir1/file-N1.txt
|-- ./dir2
| |-- ./dir2/dir2-1
| | `-- ./dir2/dir2-1/file-N3.txt
| `-- ./dir2/file-N2.txt
`-- ./dir3
`-- ./dir3/dir3-1
|-- ./dir3/dir3-1/file-\ -N5.txt
`-- ./dir3/dir3-1/file-N4.txt
5 directories, 5 files
解説
find . -type f でカレントディレクトリ配下のファイルを、サブディレクトリも含めて一覧出力します。
ポイントは -print0 です。
ファイル名の区切り文字を改行やスペースではなく null文字 にして出力します。
パイプでつなぎ、 find . -type f -print0 の結果を読み込みます。
while IFS= read -r -d $'\0' f という命令が多少複雑です。
IFS=、 -r、 -d $'\0' というオプションや環境変数はそれぞれ以下のような意味を持っています。
IFS=: readコマンドで読み込む際にスペースを区切り文字としない-r: readコマンドで読み込む際に改行を区切り文字としない-d $'\0': readコマンドで読み込む際に null文字 を区切り文字とする
このようにしないと、スペースを含むファイルが存在した場合におかしな名前にリネームされたり、エラーが発生してしまったりします。
ひとこと
こうやって小ネタながら少しずつ続けていくことが大事ですよね。 「独学大全」を読んで反省しました。
今年もよろしくおねがいします。