次のコマンドを使用して、フォルダー内の最大サイズの4つのファイルを削除しています。
find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f
それは正常に動作しますが、時々壊れたパイプエラーをスローします:
xargs: ls: terminated by signal 13
私は同様の問題に出くわし、答えの検索でこのスレッドを見つけました:
シグナル13は、パイプから何かが読み取られ、そこから何も読み取られないことを意味します(例: http://people.cs.pitt.edu/~alanjawi/cs449/code/Shell/UnixSignals.htm を参照) 。
ここでのポイントは、xargsによって実行されるlsコマンドは、次のheadコマンドが必要な入力をすべて取得し、入力パイプを閉じたときに、まだ出力を書き込んでいるということです。したがって、無視しても安全ですが、見苦しいです。 https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error で受け入れられている回答も参照してください
プログラムをhead -n 4
で意図的に終了します。これにより、「呼び出し元」が終了する前に終了したため、破損したパイプが作成されます。これはあなたが期待していることなので、それを破棄する/dev/null
にリダイレクトすることでエラーを無視できます:
find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f 2>/dev/null
さまざまな状況下で、「シグナル13で終了」という同じエラーが発生しました。ここでの他の回答は、修正に役立ちました。問題の性質について詳しく説明します。
corpy386 ~/gw/Release/5.1_v9/ClaimCenter $ find . -name '*.pcf' -not -name '*build*' | xargs grep -l ClaimSnapshotGeneralPanelSet | ( read f && echo $f && grep 'def=' $f )
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
xargs: grep: terminated by signal 13
したがって、ここに同じエラーがあり、探しているものに一致する多数のファイルがあることを知っていたときに、出力が1行だけ表示されます。問題は、xargs
が複数行の出力を生成し、read
が終了する前に1行しか消費しないことでした。 xargs
は残りの結果をパイプの1つに書き込もうとしますが、受信側は既に終了して帰宅しています。したがって、シグナル13:Broken Pipe。
修正は、ループによってxargs
のすべての出力を消費することでした-read f && do_some_things
(一度だけ読み取ります)をwhile read f; do do_some_things; done
に変更します。
corpy386 ~/gw/Release/5.1_v9/ClaimCenter $ **find . -name '*.pcf' -not -name '*build*' | xargs grep -l ClaimSnapshotGeneralPanelSet | while read f; do echo $f; grep 'def=' $f; done**
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.gl.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Pr.pcf
def="ClaimSnapshotGeneralPRPanelSet(Claim, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Trav.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.wc.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/build/idea/classes/web/pcf/claim/snapshot/default/ClaimSnapshotLossDetailsScreen.default.pcf
def="ClaimSnapshotGeneralPanelSet(Claim, SnapshotParam)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.auto.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.gl.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Pr.pcf
def="ClaimSnapshotGeneralPRPanelSet(Claim, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.Trav.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotGeneralPanelSet.wc.pcf
def="AddressSnapshotInputSet(Snapshot.LossLocation, Snapshot)"
./modules/configuration/config/web/pcf/claim/snapshot/default/ClaimSnapshotLossDetailsScreen.default.pcf
def="ClaimSnapshotGeneralPanelSet(Claim, SnapshotParam)"
これは、OPのスクリプトとまったく同じ状況ではありません-彼らは入力の一部を望んでいて、意図的にそれを切り取りました。プログラムは、受信者がまだリッスンしているかどうかをテストするのではなく、すべての入力を消費するまで実行し続けるように記述されている傾向があります。