さて早速シェルを組みたいところですが、いろいろとコマンドを組み合わせて作るので各コマンドの説明を先にしたいと思います。
■expandコマンド説明
expandは指定したファイル内のタブをスペースに変換し、標準出力に出力するコマンドです。
理解するより使った見たほうが早いので以下に例を示します。
例) タブ8で保存されているファイル hoge-tab.pyを作成し、そのファイル内のタブ8をスペースに変換したものをhoge-space.pyに保存します。
注)実行するフォルダにhoge-tab.pyやhoge-space.pyがある場合は別のファイル名に置き換えて行ってください。
-- hoge.py
aaaaaa
[タブ8]aaaaaa
aaaaaa
aaaaaa
--
コマンド
$ expand -t8 hoge-tab.py > hoge-space.py
コマンド説明 : まずオプションですが、-t8の8はタブ幅になりますので、タブが4の場合は -t4 にします。
次に変換したいファイルhoge-tab.pyを指定します。最後に出力結果をhoge-space.pyにリダイレクションして終わりです。
参考1 : expandは標準入力にも対応していますので以下のような方法でも例と同様の結果が得られます。
$ cat hoge.py | expand -t8 > hoge-space.py
■findコマンド説明
findは指定したフォルダ等を様々な条件で検索を行えるコマンドです。
あまりにもいろいろなことができるので今回は単純な例を示します。
例) 指定されたフォルダ内にある末尾が.pyのファイルを検索します。
注)スペースのみのファイル名やシンボリックリンクが存在する場合は正常に動作しませんので注意してください。
# find /tmp/hoge -name '*.py' -type f
コマンド説明 : まず /tmp/hoge で検索ディレクトリを指定します。次に -name オプションで検索条件を指定します。
今回は末尾が .py の物を検索条件にしますので '*.py'を指定します。次に -type f でファイルのみ検索対象にすると指定して終わりです。
■for文説明
プログラミングをかじったことがある方はまず知っているfor文ですが、シェルでは以下のように書きます。
--
for 変数 [in リスト]
do
処理1
処理2
処理3
処理4
done
--
これだけでは味気ないので以下にヒアドキュメントとリダイレクションを合わせたfor文を書いておきます。
for line in `cat <<_EOT_
taro
jiro
hanako
_EOT_`
do
echo ${line}
done
さて、やっと今回使うコマンドの説明が終わりましたので、記事のタイトル通り「指定したフォルダのファイルをタブ8から半角スペースに置換してくれるシェル」を書きます。
1 #!/bin/bash
2
3 for file in `find /opt/git/hde -name "*.py" -type f `
4 do
5 echo $file
6 expand -t8 ${file} > ${file}.$$
7
8 rm -f ${file}
9 mv -f ${file}.$$ ${file}
10 #expand -t8 ${file} > ${file}.$$ && mv -f ${file}.$$ ${file} || rm -f ${file}.$$
11 done
説明 : 各コマンドの説明で説明したものがほとんどですが、説明していないものを少しありますので以下に書きます。
3行目 : findをくくっている`(バッククォーテーション)は、括っている内部のコマンドを実行した結果を返します。
例の場合であれば、findコマンドの実行結果が返ります。
5行目 : echoコマンドは引数を標準出力に出力するコマンドです。
6行目 : ${file}.$$ の .$$ ですが、ぱっと見ると全く意味がわかりませんが、実行中のシェルのプロセスIDに置き換わります。
プロセスIDが100ならば、.100 になります。使い道は様々ですが今回のようにテンポラリ名によくつかわれていると思います。
8行目 : rmコマンドは指定したものを削除します。 オプションの -f で存在しないファイルの無視と削除確認を求めないオプションになります。
9行目 : mv ファイルを移動するコマンドです。オプションの -f は確認を求めないオプションになります。
10行目 : コメントアウトしてありますので、実行されることはありませんが、6、8、9行目の処理を一行にまとめ、コマンドの戻り値による例外処理を付け加えたものです。
10行目の補足 : 処理はまったく同じですが、各コマンドの実行結果(戻り値)が1の場合(成功である場合)は次のコマンドを実行するという処理を行います。
少し難しいのですが、このようにすることでexpandの失敗時とmvの失敗時に6行目で作成した${file}.$$を削除する処理を含めることができます。ですが今回は参考用にコメントアウトして書いておきます。
expandは指定したファイル内のタブをスペースに変換し、標準出力に出力するコマンドです。
理解するより使った見たほうが早いので以下に例を示します。
例) タブ8で保存されているファイル hoge-tab.pyを作成し、そのファイル内のタブ8をスペースに変換したものをhoge-space.pyに保存します。
注)実行するフォルダにhoge-tab.pyやhoge-space.pyがある場合は別のファイル名に置き換えて行ってください。
-- hoge.py
aaaaaa
[タブ8]aaaaaa
aaaaaa
aaaaaa
--
コマンド
$ expand -t8 hoge-tab.py > hoge-space.py
コマンド説明 : まずオプションですが、-t8の8はタブ幅になりますので、タブが4の場合は -t4 にします。
次に変換したいファイルhoge-tab.pyを指定します。最後に出力結果をhoge-space.pyにリダイレクションして終わりです。
参考1 : expandは標準入力にも対応していますので以下のような方法でも例と同様の結果が得られます。
$ cat hoge.py | expand -t8 > hoge-space.py
■findコマンド説明
findは指定したフォルダ等を様々な条件で検索を行えるコマンドです。
あまりにもいろいろなことができるので今回は単純な例を示します。
例) 指定されたフォルダ内にある末尾が.pyのファイルを検索します。
注)スペースのみのファイル名やシンボリックリンクが存在する場合は正常に動作しませんので注意してください。
# find /tmp/hoge -name '*.py' -type f
コマンド説明 : まず /tmp/hoge で検索ディレクトリを指定します。次に -name オプションで検索条件を指定します。
今回は末尾が .py の物を検索条件にしますので '*.py'を指定します。次に -type f でファイルのみ検索対象にすると指定して終わりです。
■for文説明
プログラミングをかじったことがある方はまず知っているfor文ですが、シェルでは以下のように書きます。
--
for 変数 [in リスト]
do
処理1
処理2
処理3
処理4
done
--
これだけでは味気ないので以下にヒアドキュメントとリダイレクションを合わせたfor文を書いておきます。
for line in `cat <<_EOT_
taro
jiro
hanako
_EOT_`
do
echo ${line}
done
さて、やっと今回使うコマンドの説明が終わりましたので、記事のタイトル通り「指定したフォルダのファイルをタブ8から半角スペースに置換してくれるシェル」を書きます。
1 #!/bin/bash
2
3 for file in `find /opt/git/hde -name "*.py" -type f `
4 do
5 echo $file
6 expand -t8 ${file} > ${file}.$$
7
8 rm -f ${file}
9 mv -f ${file}.$$ ${file}
10 #expand -t8 ${file} > ${file}.$$ && mv -f ${file}.$$ ${file} || rm -f ${file}.$$
11 done
説明 : 各コマンドの説明で説明したものがほとんどですが、説明していないものを少しありますので以下に書きます。
3行目 : findをくくっている`(バッククォーテーション)は、括っている内部のコマンドを実行した結果を返します。
例の場合であれば、findコマンドの実行結果が返ります。
5行目 : echoコマンドは引数を標準出力に出力するコマンドです。
6行目 : ${file}.$$ の .$$ ですが、ぱっと見ると全く意味がわかりませんが、実行中のシェルのプロセスIDに置き換わります。
プロセスIDが100ならば、.100 になります。使い道は様々ですが今回のようにテンポラリ名によくつかわれていると思います。
8行目 : rmコマンドは指定したものを削除します。 オプションの -f で存在しないファイルの無視と削除確認を求めないオプションになります。
9行目 : mv ファイルを移動するコマンドです。オプションの -f は確認を求めないオプションになります。
10行目 : コメントアウトしてありますので、実行されることはありませんが、6、8、9行目の処理を一行にまとめ、コマンドの戻り値による例外処理を付け加えたものです。
10行目の補足 : 処理はまったく同じですが、各コマンドの実行結果(戻り値)が1の場合(成功である場合)は次のコマンドを実行するという処理を行います。
少し難しいのですが、このようにすることでexpandの失敗時とmvの失敗時に6行目で作成した${file}.$$を削除する処理を含めることができます。ですが今回は参考用にコメントアウトして書いておきます。
Leave a comment