ホーム > Uncategorized > [覚書](shなどの)シェルスクリプトでスペースや空白を含むファイル名を処理したい2。ワンライナーで

[覚書](shなどの)シェルスクリプトでスペースや空白を含むファイル名を処理したい2。ワンライナーで

ファイル名に空白とか入っているとファイル名のリストが入った引数とかをforで回したときに空白でファイル名が分割されちゃって期待した動きにならないよね。対策はフィールドセパレータ環境変数を設定するだけの事で具体的にはIFSに改行をセットすれば良い。それとワンライナーにこだわる人が多いので対応してみた。

具体的なサンプルで説明。

fileコマンドにカレントディレクトリ以下のファイルを処理させてみる。
まずワンライナーでない基本形

IFS='
'
for i in `find . -print`
do
file $i
done

ワンライナーに圧縮すると

IFS=$'\n';for i in `find . -print`;do file $i;done

しかしIFS設定のおまじない(エスケープの書き方)を忘れそうというか、確実に忘れそうw
何か汎用的な方法はないか?

IFS='
'[enter]
set | grep IFS[enter]

出力結果に

IFS=$'\n'

が出てくる。つまりsetコマンドを覚えておけばよい

スクリプトでやる分には問題ないが、コマンドラインでこれやるとIFS変数が変更されたままになって忘れた頃に問題を起こす。あとでunset IFSする。他の変数に退避しておく。サブプロセスで実行する。等で汚染したまま使わないように。

(IFS=$'\n';for i in `find . -print`; do file $i; done)

補足。IFS='(改行)’をIFS=`echo “”`で代用できない。

広告
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。