findはすべてのファイルを検索しません


0

私は次のファイル/ディレクトリ構造を持っています:

tsunami # find .
.
./dir1
./dir1/dirinner
./dir1/dirinner/innerfile
./logs
./messages

私は再帰的にファイルを見つけて、find / execを使用してそれらを処理しようとしています。

findのバージョン(busyboxに付属)では、ここで説明しように、execコマンドで検出されたファイル名を複数回使用することはできません。そこで、提案された解決策の1つを使用しました。だから、私はこれを書き直した:

find  * -type f -exec echo {}  +

これに:

find  * -type f -exec sh -c 'echo $0' {}  +

ただし、新しいバージョンでは、最も内側のファイルのみが検索され、他のファイルは検索されません。

両方の出力は次のとおりです。

tsunami # find  * -type f -exec echo {}  +
dir1/dirinner/innerfile logs messages
tsunami # find  * -type f -exec sh -c 'echo $0' {}  +
dir1/dirinner/innerfile

どうすれば修正できますか?最も内側のファイルだけでなく、すべてのファイルを見つけるために必要です。


「+」が何をするのか理解していますか?
イグナシオバスケス-エイブラムス

私はシェルスクリプトの専門家ではありません。
hebbo

なぜ-exec条項が必要なのですか?すべてのファイルをでリストしますfind . -type f
AFH

-execは問題を表示するだけです。私の実際のスクリプトでは、-execコマンドは何か異なることをします。人々が私を助けやすくするためにそれを取り除いた。
hebbo

回答:


2

echo実験を実行するのはあなたのモルモットだけだと思います(find . -type fファイルパスを印刷するのは唯一の仕事です)。

私の答えでは、単純化のためfind . …find * …-の代わりに使用しています。シェルグロビングを使用する理由がある場合は、先に進みます。

あなたの問題は、-exec … {} +構文が{};の代わりに一度に多くのパスを置き換えるためです。これで多くの引数を取得しますが、残りは未使用のまま、ただものをいいます。-exec sh -c 'echo $0' {} +sh$0

使用"$@"、それは意味し"$1" "$2" "$3" …ます。スキップ$0するため、追加の(ダミー)引数を指定する必要があります。sh私が使用してsh

find . -type f -exec sh -c 'echo "$@"' sh {} +

また、1つのコマンドラインで処理するにはファイルが多すぎる場合は、複数のsh-s(したがって複数のecho-s)が実行されることに注意してください。


代わりに-exec … {} +使用する代わりに-exec … \;

find . -type f -exec sh -c 'echo "$0"' {} \;

これはshファイルごとに個別に実行されるため、$0十分です。

もう1つの違いは、ほとんどのfind実装ではの{}直前である必要があります+が、\;この{}場合はとの間のどこかに-execなり\;ます。だということだ:

  • -exec foo {} bar + 無効です;
  • -exec foo {} bar \; OK

ただし、この違いは特定のケースでは重要ではありません。


ああなるほど。あなたが正しいです。+の代わりに\を使用するのが最善だと思います。あなたの答えは、より良い解決策を探すのに役立ちました。
-hebbo

これが最後のコマンドです。find * -type f -exec sh -c 'echo $ 0' {} \;
hebbo

@hebbo 意図的に使用すると思った+
カミルマシオロウスキ

どちらにしても。ソリューションも優れています。
hebbo

@hebboあなたはあなた自身の答えを書くつもりですか?または、回答にバージョンを含めて完成させることはできますか?
カミルマシオロウスキ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.