findを使用してディレクトリ名のリストを取得します


35

ディレクトリ名のリストを取得するためにこれを行うことができることを知っています:

find . -type d -maxdepth 1 

出力は次のようになります。

.
./foo
./bar

なしのリストが好き./です。findに生の名前だけを出力させる方法はありますか?

リストをフォーマットするためにstatに送信しようとしましたが、同じ結果が得られます。

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

あなたは前にいfoo bar ...なくても1行ですべてが欲しい./ですか?
レボン

これは純粋に美容上の理由のためですか、それとも出力で何かをしようとしていますか?
jw013

回答:


42

GNU findでは、次の-printfオプションを使用できます。

find . -maxdepth 1 -type d -printf '%f\n'

コメントでPawełが述べたように、現在のディレクトリを一覧表示したくない場合は-mindepth 1、たとえばaddを追加します。

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'

最新のPOSIX仕様でこの-printfオプションの言及を見つけることができず、どのように移植性があるのか​​疑問に思います
...-rahmu

@rahmu:これはGNU findでテストされました。いずれprintfのオプションは、POSIXで言及されていないと、彼らは他のいくつかによってサポートされていないようですfindバージョン。GNU findはほとんどの場所にインストールできるため、その意味で移植可能です。
トール

1
-mindepth 1.
削除

18

更新:

より短い代替案:

 find . -maxdepth 1 -type d | cut -c 3-

名前をスラッシュなしで1行に1つずつ表示します


4
@downvoter .. A downvote なし説明役に立たない(OP、SOまたは私)。これは、OPの質問に対する機能的な解決策です。指摘された場合はエラーを修正するか、回答を改善することができますが、匿名の「クリック」ではなく建設的なフィードバックが必要です。
レボン

1
あなたの答えに構文解析が含まれていたとき、私は投票した人ですls。同時に、それが削除された別の回答でこれが悪い考えある理由に関するリンクを投稿しました。当時は2つの答えしかなく、理由は明らかでした。あなたがあいまいさを指摘してくれてうれしいです、そして、ここに私の説明があります。記録のために、私はあなたの現在の答えに同意するので、私は下票を上票にした。
rahmu

@rahmu 別の質問で下票の説明をすることは、私には役に立たない(そしてあなただけに明らかである)。また、これはより良い解決策ですが、以前に投稿した解決策はうまくいきました(はい、私はあなたの「lsを使用しない」リンクに精通していますが、すべての場合に盲目的に適用されるわけではありません)。私の最初の解決策がうまくいかなかった理由の反例がある場合、私はそれを知りたいです(実際にこれから何かを学ぶことができます)、そうでなければあなたはリンクを投稿するだけで建設的なものを提供していません。
レボン

\nディレクトリ名にa があり、それを取得するためにcutを使用できないことを考慮してください(これは、私があなたに投票したときのことです)。ls危険な振る舞いをしないケースはほとんどなく、別の方法を使用する方がほとんど常に安全です。
rahmu

9

GNU findを使用して、-mindepthを使用して、findが現在のディレクトリと一致しないようにすることができます。

find . -type d -maxdepth 1 -mindepth 1

これを再帰的に行っていないため、bash globを使用できます。

echo */

末尾に/をグロブに追加すると、ディレクトリのみが一致します。


1
*/ドットファイルが欠落し、シンボリックリンクが含まれます。これは問題になる場合もあれば、そうでない場合もあります。
ジル 'SO-悪であるのをやめる

@Gilles-常にシンボリックリンクを見逃しますが、ドットファイルはdotglobが設定されているかどうかに依存します。
ヨルダン

6

sedこれらの2つの文字を削除しましょう。

find . -maxdepth 1 -type d | sed -e 's/^\.\///'

6

私はむしろ使用したい:

 find ./ -type d -maxdepth 1 -exec basename {} \;

2

私は通常使用します:

find * -type d

しかし、それがあなたが望むことをする正しい方法であるかどうかはわかりません。


1
シェルがすべてのファイル名を展開できるようにする場合、なぜfindを使用するのですか?
ヨルダン

@jordanmディレクトリのみを選択します。echo */多かれ少なかれ同じことを行いますが(ドットファイルを見逃し、シンボリックリンクを含みます)、joachimはfinalを削除する方法を尋ねます/
ジル 'SO-悪であるのをやめる

0

AIXでは、パラメーター 'maxdepth'は機能しません。

一般的にこれは私のために働く:

find ./ -type d | cut -d"/" -f2 | sort -u


0

あなたが探しているものはと呼ばれbasename、UNIXディレクトリ構造を無視します

以下の例:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

dirパスも出力から除外しcd 、コマンドを実行する前に必要性を削除します


いくつかの追加情報:

-exec引数として渡して、代わりに|出力用の別のコマンドを見つけます(パイプ)

注:findオプションは定位置ではあり ません(-maxdepthは、その前に指定されたテストとその後に指定されたテストに影響します)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.