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@)

...ここで、glob修飾子/@、以前のワイルドカードパターンがそれぞれディレクトリまたはシンボリックリンクのみを一致させ、ND設定オプションとシェルオプションと同じ効果を持ちます(一致しない限り、何も拡張されず、隠された名前も一致します)。結果の名前を単一の列に印刷します(バックスラッシュシーケンスの解釈を防ぐ)。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 \)

(エスケープされ、シェルに意味がありません)。

関連情報