それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bash の* ( アスタリスクのワイルドカード)でドットファイル(隠しファイル)を一時的にマッチさせる

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