詳細

詳細

次のディレクトリツリーがあるとします。

.
├── 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シェルオプションの設定に従います。

関連情報