ディレクトリのサブディレクトリを見つけることができます
ls -d -- */
または
ls -l | grep "^d"
しかし、これらは両方とも間接的に見えるので、ディレクトリだけを見つける標準的な方法があると思います。これを行う正しい方法はありますか?そうでない場合、これらのいずれかがエッジケースで望ましくない動作につながるのでしょうか?(シンボリックリンク、隠しディレクトリなど)
ディレクトリのサブディレクトリを見つけることができます
ls -d -- */
または
ls -l | grep "^d"
しかし、これらは両方とも間接的に見えるので、ディレクトリだけを見つける標準的な方法があると思います。これを行う正しい方法はありますか?そうでない場合、これらのいずれかがエッジケースで望ましくない動作につながるのでしょうか?(シンボリックリンク、隠しディレクトリなど)
回答:
答えは、あなたが何をするつもりで、より依存してやる、あなたが探しているものに比べて出力。端末で視覚的に参照するためのリストを見たいだけの場合、最初の解決策は実際には非常に優れています。出力を処理する場合は、別の方法の使用を検討する必要があります。
リストを取得して別のプログラムにフィードする最も堅牢な方法の1つは、を使用することfind
です。
find -maxdepth 1 -type d
これがフィードに適している理由は、find
を使用してnullで区切られたデータを、-print0
またはを使用して別のプログラムの引数として文字列を適切にエスケープできるため-exec
です。これがlsの出力を解析するよりも優れている理由については、GregのWikiのParsingLSを参照してください。
find . -maxdepth 1 -mindepth 1 -type d
。それ以外の場合は、現在のディレクトリ.
が含まれます。
参考までに-ZSH(BASHではない)では、次のこともできls -d -- *(/)
ます。修飾子は唯一のグロブディレクトリにZSHに指示します。(/)
とはいえ、独自に提案したソリューション(ls -d -- */
)とそれほど違いはなく、標準とはかけ離れています。
ls
(おそらく他のフラグに基づいて異なる)の出力に関する限り:
% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2
*(/)
は、非表示ではないディレクトリに*/
展開する一方で、非表示ではないディレクトリまたはディレクトリへのシンボリックリンク(または、少なくとも、それらがディレクトリであることがわかるパスへのシンボリックリンク)に展開することに注意してください。
find . -maxdepth 1 -type d
これをOS X Yosemiteで機能させるには、入力する必要がありました。