次のディレクトリツリーがあるとします。
.
├── 11
├── 111
├── 112
├── 1121
├── 113
├── 11a
├── 11a1
├── 1a1
├── 1a2
├── 1aa1.png
├── 2a1
├── a.
├── a1a
├── a1a.jpg
├── a2a
├── aa
├── -aa
├── aa.gif
├── aa.jpg
├── aa.png
├── aa.tiff
├── a.exe
├── a.gif
├── a.html
├── a.jpg
├── a.png
├── a.tiff
├── b2
├── b2a
├── ba.gif
├── ba.jpg
├── ba.png
├── ba.tiff
├── b.html
├── cb1.png
├── d.gif
└── sub1
├── d.gif
└── sub2
したがって、.($PWD) であるが拡張子が ".jpg" のファイルを一致させるには、次のようにします。
ls !(*.jpg)
ただし、次のように出力されます。
11 1121 11a1 1aa1.png a1a aa.gif a.exe a.png b2a ba.tiff d.gif
111 113 1a1 2a1 a2a aa.png a.gif a.tiff ba.gif b.html .gif
112 11a 1a2 a. aa aa.tiff a.html b2 ba.png cb1.png
sub1:
. .. d.gif sub2
sub1とその内容(ディレクトリを含む)の両方を除外したいと思います。つまり:
sub1: . .. d.gif sub2
以下を使用して除外できます。
GLOBIGNORE='sub1'
lsの前に他の名前のディレクトリがある場合はどうなりますか?
これを行う方法はありますか?
答え1
シェルでなければなりませんかbash
? ZSHとsetを使用すると、glob式を通常のファイルに制限EXTENDED_GLOB
できます。(.)
()
.
$ PS1='%% ' zsh -f
% setopt EXTENDED_GLOB
% mkdir foo && cd foo
% touch nope.jpg
% mkdir sub1
% touch asdf
% print ^*.jpg
asdf sub1
% print ^*.jpg(.)
asdf
%
答え2
テイクアウトソリューション:
ls -pd !(*.jpg) | grep -Ev /$
詳細
glob パターンはサブディレクトリには含まれません。ls
機能:コマンドラインにディレクトリを渡すと、そのディレクトリの内容が表示されます。
ls
次に置き換えるecho
:
$ echo !(*.jpg)
または(ほぼ)同等の解決策:ls
ディレクトリに入らないように指示します。
$ ls -d !(*.jpg)
コメントの質問に答えるには、「lsコマンドを使用してフォルダを除いてファイルのみを一覧表示するにはどうすればよいですか?」という質問に答えるには、次の手順を実行します。
ディレクトリを一覧表示する簡単な方法は次のとおりです。
echo */
したがって、ディレクトリ以外のファイルのみを一覧表示する答えは、次のようにして実行できます。grep -v
$ ls -p | grep -Ev /$
$ find . -maxdepth 1 ! -type d
findはドットファイル(隠しファイル)を一覧表示します。そしてfind . -type d
(また)シンボリックリンクも従わない。
または実用的な(posix)ループ:
$ for f in * ; do if [ -f "$f" ] ; then echo "$f" ; fi ; done
もちろん、負の拡張に対する具体的な解決策は次のとおりです。
$ ls -pd !(*.jpg) | grep -Ev /$
11
111
112
1121
113
11a
11a1
1a1
1a2
1aa1.png
2a1
a.
a1a
a2a
aa
aa.gif
aa.png
aa.tiff
a.exe
a.gif
a.html
a.png
a.tiff
b2
b2a
ba.gif
ba.png
ba.tiff
b.html
cb1.png
d.gif
メモ:
オプション -p は grep と連携してディレクトリを識別します。 ls のマニュアルページを参照してください。
-p, --filetype, --indicator-style=ファイルタイプ
答え3
たとえば、次のように出力をフィルタls
にパイプできます。grep
ls * | grep -v "jpg"
文字列"jpg"を含まないすべての一致を返します。 (このgrep -v
フラグは一致を反転し、指定された文字列を含まないすべての行を返します。)
答え4
lsの前にGLOBIGNORE = 'sub1'を使用して除外できますが、別の名前のディレクトリがある場合はどうなりますか?
~からバッシュリファレンスマニュアル、グロビゴアは次のとおりです。
ファイル名拡張時に無視されるファイル名のセットを定義するコロンで区切られたパターンのリスト。ファイル名拡張子パターンに一致するファイル名が GLOBIGNORE のパターンの 1 つとも一致する場合は、一致リストから削除されます。パターンマッチングはextglobシェルオプションの設定に従います。