find コマンドの結果を別のコマンドに複数のオプションとして渡します。

find コマンドの結果を別のコマンドに複数のオプションとして渡します。

複数の値を含むオプションを使用するCLIツールがあります。構文は次のとおりです。

CLI -I path/to/file1 -I path/to/file2 ...

findコマンド結果をこのCLIにどのように渡しますか?


参考までに

位置パラメータが複数ある場合:

CLI path/to/file1 path/to/file2 ...

私はできます:

find "dir" -name "pattern" -exec CLI {} \+

ベストアンサー1

zsh切り替えがオプションの場合は、次の方法で簡単に実行できます。

CLI **/pattern(P[-I])

ここで、Pglob修飾子は、P一致する各ファイルのプレフィックスとしてパラメータを挿入するために使用されます。

kshスタイルのプロセス置換をサポートするGNUfindxargszshやbashなどのシェルを使用すると、次のこともできます。

xargs -xr0 -n100 -a <(find . -name pattern -printf '-I\0%p\0') CLI

100ここでは、引数リストが単一の呼び出しに合うように十分に小さい偶数を選択しますCLI。これがない場合は、xargsリストを-I次のファイルに分割できますp。それでもその制約を満たさない場合は、少数の引数で実行するのではなく-n 100終了します。-xxargsCLI

これに同意する場合は、CLI次のこともできます。-Ipath/to/file-I path/to/file

find . -name pattern -exec bash -c '
  exec CLI "${@/#/-I}"' bash {} +

これは、必要に応じて複数回呼び出してパラメータサイズの制限を解決するためのものですが-exec cmd {} +、bashは各パラメータにを追加するため、独自に実行された場合でもその制限に達する可能性があります。cmd-Icmd

ただし、そのプレフィックスは-Iすべてのファイルパスに追加されたプレフィックスと同じ長さであり、ここでは必要ではない./ため、次の代わりに問題を完全に回避することもできます。bash./-I

find . -name pattern -exec bash -c '
  exec CLI "${@/#.\//-I}"' bash {} +

.それ自体(開始ファイル)が次のようになるとします。模様)。

上記の方法はシステムコールの制限zshを解決しようとせず、一度だけexecve()実行されるか、CLIまったく実行されません。zargs自動ロード機能を使用してこの制限を解決できます。

CLIファイルごとに一度だけ呼び出すことが重要な場合は、-I file最新バージョンのLinuxではスタックサイズの制限を増やすことlimit stacksize 100Mができます(例:zshのデフォルト値8MiB)。execve()制限はスタックサイズの制限に比例するためです。

おすすめ記事