TL;DR
shopt -s dotglob shopt -u dotglob
ドットファイルも含めたい時がある。
for i in $ (ls -a)
はめんどくさいんだよなぁ
ホームディレクトリで、*でワイルドカードマッチさせても一致しないのが不便。 ls -al
しているときは気にならないのだけど、一括して容量を取得したり、ファイルをまとめて移動させたいときなど、ワイルドカードでドットファイル(隠しファイル)が指定されなくて困る時がある。
ホームフォルダ内の容量を見たいとき。
takuya@takuya$ du -cksh * 9.0M Documents 17M Library 20K PhpStorm2018.3-settings.zip 2.5M iodine 28M total
あああ、ドットファイル無いよ。
これで解決。
shopt -s dotglob
shopt のdotglob を指定すれば、dotfile も含めて コマンドの引数に展開される。
takuya@takuya$ du -cksh * 4.0K .auth_keys 4.0K .bash_aliases 4.0K .bash_completion 48K .bash_completion.d 4.0K .bash_profile 8.0K .bashrc 4.0K .bashrc.cygwin 4.0K .sqliterc 36K .ssh 8.0K .tidy.conf 32K .vim 20K .viminfo 12K .vimrc 9.0M Documents 17M Library 2.5M iodine 136M total takuya@takuya$ shopt -u dotglob
やったね。
もとに戻すなら
かと言って、いつでもdotfiles が含めコマンドの引数に、ワイルドカードが展開されるのは不便なので、一時的にオンにしたらもとに戻したい。
shopt -u dotglob # 設定をオフにする
現在の設定を確認する。
あれ?いま展開するんだっけ?しないんだっけ?設定を見るには。
takuya@$ shopt -p dotglob shopt -u dotglob
これで設定ができる。
使い方の例
設定を見ると、設定がコマンドとして機能するので、これを利用して、次のように活用できる。
dotglob_last_state=$(shopt -p dotglob) for i in * ; do echo $i; done $(dotglob_last_state)
トグルできるコマンドを作ってもいいけど、そこまでするほどでもないと思う。
その他の解決方法
find や ls と組み合わせで出来なくもないけど、すこし煩雑な気がする。半角スペースが混じったファイル名やフォルダ名のときにうまくいかない。(IFSを指定すればうまくいくけど)
find -maxdepth 1 -exec echo {}\; for i in $( ls -a ) ; do echo $i; done
shopt で設定できるその他のglob 関連
ワイルドカード関連の自動展開や補完の関連がshopt で設定できるので合わせて覚えておきたい。
- dotglob
- extglob
- globstar
- nocaseglob
- nullglob
- direxpand
関連資料
http://takuya-1st.hatenablog.jp/entry/2016/04/05/025553
参考資料
https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html