空白入りファイルのまとめ方


アニメ『冴えない彼女の育てかた♭』

2期目では、ものづくり色が濃くなってます。本当に良い作品は、余裕のない状態で生まれるのでしょうか、それとも余裕がある状態で生まれるのでしょうか。
暇な時より忙しくしていた方がいろんなことがやれるってのは、ただの怠慢にも感じます。暇な時に無計画でさぼってただけですので。本当に忙しいと、寝ることもできないはずなので、その時心に刻んだ苦しみを覚えていれば、暇な時にさぼったりしないよなあ、なんて思います。

今回は空白入りファイルのまとめ方、というかbashでのさばき方です。

空白入りファイルをforで回そうとすると、デリミタと認識してしまいファイル名が空白部分で分割されてしまいます。

空白入りファイル

空白入りファイルとして以下のファイルを使います。

takk@debian:~$ ls -1
file 001.txt
file 002.txt
file 003.txt
file 004.txt
file 005.txt
file 006.txt
file 007.txt
file 008.txt
file 009.txt
file 010.txt
takk@debian:~$

findの結果でforを回す場合

findの結果をforへ渡すと、見事にスペースで区切られます。

takk@debian:~$ for m in `find`;do echo $m;done
.
./file
001.txt
./file
006.txt
./file
002.txt

(省略)

./file
009.txt
./file
005.txt
takk@debian:~$

lsの結果でforを回す場合

こちらもfindと同様です。

takk@debian:~$ for m in `ls`;do echo $m;done
file
001.txt
file
002.txt
file
003.txt

(省略)

file
009.txt
file
010.txt
takk@debian:~$

変数に代入すればわかる通り、空白は

takk@debian:~$ aaa=(file 001.txt file 002.txt)
takk@debian:~$ echo ${aaa[1]}
001.txt
takk@debian:~$

デリミタを空白から改行へ変更

解決方法としては、デフォルトのデリミタは空白となっていますので、改行に切り替えてやればよいだけです。

takk@debian:~$ echo $IFS | od -td1
0000000   10
0000001
takk@debian:~$

IFSは以下のようにバックアップしてから後で戻してもよいですが、

takk@debian:~$IFS_BACKUP=$IFS

面倒なので、以下のように()で囲んで別プロセス内で使用します。

takk@debian:~$ (IFS=$'\n';for m in `find`;do echo $m;done)
.
./file 001.txt
./file 006.txt
./file 002.txt
./file 008.txt
./file 003.txt
./file 007.txt
./file 010.txt
./file 004.txt
./file 009.txt
./file 005.txt
takk@debian:~$

難なく空白入りファイル名で回すことができました。

コメント

タイトルとURLをコピーしました