extglobの否定が期待どおりに機能しません。

extglobの否定が期待どおりに機能しません。

否定を使用してディレクトリを除外しようとしましたが、ディレクトリはパターンマッチングにまだ表示されます。

bash-4.3$ ls
file_1.txt  testdir
bash-4.3$ shopt extglob
extglob         on
bash-4.3$ echo !(*/)
file_1.txt testdir
bash-4.3$ 

私は何が間違っていましたか?

for注:ループまたは[コマンドが利用可能であることを知っていますが、具体的には調べたいとfind思います。extglob

答え1

あなたは、、.../にいることはできません。@(...)!(...)*(...)

/glob間にのみ表示またはa[x/y]b考慮することもできます@(a\[x)/@(y\]b)。 globは最初に分割され、/各部分はディレクトリの内容と一致します。ただし、ksh glob拡張子がある場合、内部拡張子は分割されませんが、x(...)各glob部分はまだファイル名と一致します。では、現在のディレクトリのすべてのファイル名と一致します。明らかに、ファイル名に含めることができないため、一致するものがないため、すべてのファイルと一致します。/(...)!(*/*)*/*/!(*/*)

zshここではglob修飾子を使用する必要があります。

echo *(^/)

ディレクトリを除くすべての種類のファイルで動作します。または 's (ディレクトリタイプのすべてのファイル)bashの逆です。*/シンボリックリンク解決後):

echo *(-^/)

(ディレクトリでもディレクトリシンボリックリンクでもないファイル)

関連情報