findを使用するときは、親ディレクトリをサブディレクトリの一部としてリストしないでください。

findを使用するときは、親ディレクトリをサブディレクトリの一部としてリストしないでください。

次のような状況があるとしましょう。

$ find ./src -name '*.txt'
./src/file1.txt
./src/subdir1/file2.txt
./src/subdir1/subsubdir1/file3.txt
./src/subdir2/file4.txt

検索しているディレクトリを除外したいと思います。次のようになります。

./file1.txt./src/file1.txt
./subdir1/file2.txt待つ代わりに./src/subdir1/file2.txt

追加しても-mindepth 1効果はありません。

私が欲しいものを純粋にできますかfind

答え1

findサポートされているバージョンがない場合は、この-printf '%P'代替構成を使用して検索パスを含めないでください。

問題の始点:

find ./src -name '*.txt'

同じですが、結果に検索パスはありません。

( cd ./src && find . -name '*.txt' )

あなたの質問に示されているファイル構造を仮定すると、結果は次のようになります。

./file1.txt
./subdir1/file2.txt
./subdir1/subsubdir1/file3.txt
./subdir2/file4.txt

答え2

延長対象@steeldriverさんが言った。:

$ cd "$(mktemp --directory)" # create temporary directory
direnv: unloading
$ mkdir foo bar
$ touch foo/1 bar/2
$ find foo bar -type f -name '*' -printf '%P\n'
1
2

GNUマニュアルは%Pフォーマット文字列を次のように記録しますfind

%P
ファイル名とファイルが見つかった元の名前が削除されました。

ここで、「ファイル名」は単にファイル名ではなく、見つかったファイルのパス名を意味します。

関連情報