私は 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 列に出力します(バックスラッシュシーケンスの解釈を回避します)。nullglob
dotglob
bash
print -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 \)
(エスケープされているため、シェルにとっては何の意味もありません)。