find コマンドを使用してシンボリックリンクとディレクトリの両方を見つける方法

find コマンドを使用してシンボリックリンクとディレクトリの両方を見つける方法

私は find コマンドが嫌いです。ただ、それをはっきりさせたいだけです。これは、私が長年使用してきた Linux 界の CLI ツールの中で、断然最悪の設計です。

結局、次のコマンドは何も返しません。

cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d

どうやら -type l と -type d が矛盾しているため、何も返されないのでしょうか? 次のように使用した場合:

cd "$go_proj_path_root" && cd .. && find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l 

すると、ディレクトリ内のシンボリックリンクが見つかります。同じコマンドでディレクトリとシンボリックリンクの両方を見つける方法はありますか? 本当にひどいですね、見つけてください! シンボリックリンクだけが必要な場合は、-type l..wtf を使用します。

答え1

はい、-type l -type dファイルがディレクトリである場合そして「シンボリック リンク」 を試してみるとよいかもしれません\( -type l -o -type d \)

また、 は必須ではないことにも注意してください(アクセス権のあるディレクトリであるcdことを確認するために使用している場合を除く)。$go_proj_path_root

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \) -print

あるいは、単一のディレクトリ内のファイルのみに関心があるようですので、次のようにします。

shopt -s nullglob dotglob
for name in "$go_proj_path_root"/*; do
    if [ -d "$name" ] || [ -L "$name" ]; then
        printf '%s\n' "$name"
    fi
done

シェル付きzsh:

print -rC1 -- $go_proj_path_root/*(ND/) $go_proj_path_root/*(ND@)

... ここで、グロブ修飾子/とにより、@前述のグロブパターンはそれぞれディレクトリまたはシンボリックリンクのみに一致し、でおよびシェルオプションNDを設定するのと同じ効果があります(一致しない場合は何も展開されず、隠し名前にも一致します)。 は、結果の名前を 1 列に出力します(バックスラッシュシーケンスの解釈を回避します)。nullglobdotglobbashprint -rC1-r

答え2

検索条件を追加すると、デフォルトですべて適用されます。

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -type d

リンクとディレクトリの両方であるファイルを要求しています。

「または」を使用する必要があります。

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 -type l -o -type d

ここでは必要ありませんが、 を括弧で囲む習慣をつけることをお勧めします-o

find "$go_proj_path_root" -mindepth 1 -maxdepth 1 \( -type l -o -type d \)

(エスケープされているため、シェルにとっては何の意味もありません)。

関連情報