Humanity

Edit the world by your favorite way

bashとzshで使える、特定ファイルを除外するglob記法

2012-04-15 追記

勘違いしてました。
ただの正規表現だったようです。
確かめたら確かにiってファイルが残りました。

id:mattn: これ、正規表現のパターンだよね?ってことはa b c iってファイルがあったら[^dir]でiってファイル残るよね。

はてなブックマーク - bashとzshで使える、特定ファイルを除外するglob記法 - Humanity

2012-04-20 追記

ツッコミもらいました。というかもらってました。追記するの遅すぎ。

@mattn_jp zsh だと *~dir, bash だと !(dir) でいけそうですね。

https://twitter.com/#!/nakamuray/statuses/191536570132733952

とのこと。

# bash
$ mv !(dir) dir/
# zsh
$ mv *~dir dir/

どっちもいけました。@nakamurayさんありがとうございます。
と言う訳で以下の記事は間違いです。

元記事

どこで見たか忘れたけど、こんなの始めて知った。

$ cp ./[^Makefile]* hoge/ # Makefile以外をhoge/に移動

cpをechoに変えるとどんな引数に展開されているか分かる。
これまで全てのファイルを1階層下のディレクトリに移動する時はこんな風に打ってました。(警告出るけど警告なので無視してた)

$ ls
a b c
$ mkdir dir
$ mv * dir/   # 警告が出るけど移動されるので無視してた
mv: `dir/' をそれ自身のサブディレクトリ `dir/dir' に移動できません

まぁ対話的にコマンド実行する場合は別に警告出ても目的達成できてるからいいとは思いますが。
むしろ警告出てなかったら今居るディレクトリ間違えたかな、とかわかるし。分かってればOKだと思う。
けどまぁスマートじゃないので、今度から「mv [^dir]* dir/」を使って横で見てた人に「今何やったの?」って聞かれたらドヤ顔で説明しようと思います。


ちなみに/bin/sh(LinuxMintなので実際は/bin/dash)では動きませんでした。
自分はなるべく/bin/shで書きたい派(checkbashism便利)な人なので、対話的にコマンド実行する時には使えるなーという印象。
というかシェルスクリプトなんて本気で書くもんじゃないんだからそんなこだわり持っても無駄だと思う。