理系学生日記

おまえはいつまで学生気分なのか

lsの結果をawkすることについての注意点

重箱の隅を突つくような話ですが、ls の結果を awk するのは筋が悪いと言われています。ファイルパーミッションを抜くとか、そういうときに、このような使われ方が為されますが、だいたいの場合は代替案(もうちょっと相応しいコマンド) があるので注意しましょう。 ls -l | awk とかが良くないとされるのは、ぼくの知る限り、これは次の 2 つの理由に依っています。

  1. ls -l 等で表示されるカラム順は定義されていないため、システム間で順番が異なる可能性がある
  2. ls が表示するファイル名というのは任意の文字を含み得る

1 つ目については、まぁそうだよね、という話ですが、2 つ目については具体的な例があった方が分かりやすいかもしれません。

以下のように、改行を含むファイル名というのは容易に作成することができます。

$ touch "Hello
World"
$ touch "Hello
World2"

ここで ls してみると、あたかも普通に表示できます。

$ ls -l
total 0
-rw-r--r-- 1 kiririmode staff 0  7 23 15:34 'Hello'$'\n''World'
-rw-r--r-- 1 kiririmode staff 0  7 23 15:34 'Hello'$'\n''World2'

が、ファイル名に改行コードを含むのは間違いないので、これを awk に渡してしまうと想定通りの出力にはなりません。

$ ls -l | awk '{ print $0 }'
total 0
-rw-r--r-- 1 kiririmode staff 0  7 23 15:34 Hello
World
-rw-r--r-- 1 kiririmode staff 0  7 23 15:34 Hello
World2

信頼できない入力文字列をそのまま信じてしまうとマズいという意味では、Web アプリケーションにおけるサニタイズとかと同じようなものかもしれないですね。 とはいえ、それを気にしないといけない状況っていうのは滅多にないと思いますが。

ちなみに、制御文字とかも余裕でファイル名に入れることができるので、いろいろ楽しんで人に迷惑をかけて怒られたら良いですね。

$ touch "$(echo -e "ab\ac")"