重箱の隅を突つくような話ですが、ls
の結果を awk
するのは筋が悪いと言われています。ファイルパーミッションを抜くとか、そういうときに、このような使われ方が為されますが、だいたいの場合は代替案(もうちょっと相応しいコマンド) があるので注意しましょう。
ls -l | awk
とかが良くないとされるのは、ぼくの知る限り、これは次の 2 つの理由に依っています。
ls -l
等で表示されるカラム順は定義されていないため、システム間で順番が異なる可能性がある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")"