xargsをGNU並列にパイプ

xargsをGNU並列にパイプ

特定のディレクトリの絶対パスを取得し、圧縮のためにGNUにパイプする次のスクリプトがありますparallel。信号13エラーが発生し続けるが、理由がわからない。

find $directory -maxdepth 1 | \
grep -v "^${directory}$" | \
xargs realpath | \
parallel -j 4 zip -r ${new_directory}/{/.}.zip {}

エラーはですterminated with signal 13; aborting。時にはエラーは発生しませんが、zipファイルが出力に存在しないことがありますnew_directory

どんな助けでも大変感謝します。

答え1

経験している実際のエラーを解決する前に、いくつかの極端なケースを処理するためにコマンドでいくつかの問題を修正する必要があります。

find "$directory" -maxdepth 1 -mindepth 1 -print0 | \
xargs -0 realpath | \
parallel -j 4 zip -r "$new_directory"/{/.}.zip {}

変更は次findのとおりです。

  • -mindepth 1- これにより、最上位ディレクトリが除外されるため、コマンドは不要ですgrep -v
  • -print0- これにより、スペースやエスケープ文字を含むファイルで発生する可能性がある問題を解決します。すべてのファイルは、新しい行ではなく null 文字で区切られます。

そのため、NULL文字で区切られた入力を読み取れるようにコマンドに-0追加する必要があります。xargs

その他のトラブルシューティング

問題が解決しない場合は、さらにデバッグする必要があります。

  1. まず、parallelコマンドを完全に削除し、コマンドへの入力が期待どおりであることを確認します。

  2. 問題がなければ、parallelコマンドに詳細を追加して、実行中の操作を正確にキャプチャします。

parallel -t -j 4 zip -r ${new_directory}/{/.}.zip {} 2> parallel.log
  • これにより、ファイルで実行されたコマンドのリストが表示されますparallel.logzipコマンドが正しく生成されたことを確認してください。
  1. ログファイルのコマンドリストにまだ例外が表示されない場合は、zipファイルのコマンドを試してください。
bash -x parallel.log

プロセスのある時点でエラーが発生したステップを確認する必要があります。

関連情報