私はファイルシステムを持っています
/x/./
ディレクトリにはディレクトリ、、、、がx
含まれます。私はすべてを見つけたいのですが、
どのように書くべきですか?a
b
c
y
/x/./
/x/y/./
私は試した
find /x/./ -path "/x/y/" -prune -type f
しかし、うまくいきません。なんで?
find
非常に文字通りです。これらの 2 つのパスが同じディレクトリを参照していても、 ではないため、/x/y/
以下にあるとは見なされません。また、明示的な論理接続詞が指定されていない場合に操作を組み合わせる方法にも問題がある可能性があります。その方法を思い出せません (常に明示的な接続詞を使用する方が簡単です)。/x/./
/x/./y/
単独で完全なパス名でない場合.
は、常に省略しても問題ありません。このコンテキストでは、末尾のスラッシュも不要です。代わりに試す
find "/x" -path "/x/y" -prune -o -type f -print
この場合、二重引用符も技術的には不要ですが、パス名に特殊文字が含まれている場合は二重引用符が必要になります。
編集: 探しているファイルが 2 レベル下にあることがわかっている場合は、2 レベル下find
から検索を開始するように指示します。2 つの可能性があります: 必要なすべてのファイルを含むサブディレクトリの名前を知っている -
# by definition nothing in /x/a/foo can be under /x/y
find "/x/a/foo" -type f -print
-- またはそうしない --
# The stars in the first argument have to be outside the quotes,
# so the shell expands them. The stars in the -path argument have to
# be inside quotes so the shell *doesn't* expand them.
find "/x/"*/* -path "/x/y/*" -prune -o -type f -print
論理接続詞を説明するのは難しいです。 -path whatever
とは条件の-type f
ように振る舞いますが、 と は条件付きブロック内のもののように振る舞います。しかし、これは単純化しすぎており、詳細が重要です。GNU find マニュアル全体をお読みください。それを行った後も何か不明な点がある場合は、ここで新しい質問をしてください。if
-prune
-print
-o
else
or