0

Unixでは、私は次のようなコードを持っています

find /dir -name "filename*" -type f -print | xargs rm

case "$?" in
     "0") status="SUCCESS";;
      *) status=FAILED";;
esac

FAILEDが返されてきましたが、ファイルが削除される前にcaseステートメントが実行されたためだと思います。おそらく、最初のステートメントの後に待機時間を追加すると、ファイルが完全に削除されたことを確認できます。その場合、スクリプトに60秒などの待機時間を追加するにはどうすればよいですか?

編集:ファイルが削除されていることを言及する必要がありますが、終了ステータスはゼロではありません。

4

2 に答える 2

2

filespecに一致する奇妙な名前のファイルがある場合、あなたがしていることは問題があります。findの出力をxargsにパイプすると、昔ながらの解析LSの問題が発生します。

[ghoti@pc ~/tmp2]$ touch $'one\ntwo.txt' "three four.txt"
[ghoti@pc ~/tmp2]$ find . -name "*txt" -type f -print | xargs rm
rm: ./three: No such file or directory
rm: four.txt: No such file or directory
rm: ./one: No such file or directory
rm: two.txt: No such file or directory

rm内で直接処理してみませんfindか?

find /dir -name "filename*" -type f -exec rm {} \;

結果をテストするには、次のいずれかを取得できます$?

find /dir -name "filename*" -type f -exec rm {} \;
result=$?
case "$result" in
etc, etc

$?後で再利用するのに役立つ場合findや、戻り値が評価される場所との間で他のコマンドを実行する必要がある場合に備えて、変数を入力しました。)

または、成功を直接テストすることもできます。

if find /dir -name "filename*" -type f -exec rm {} \;
then
    echo "SUCCESS!"
else
    echo "FAIL!"
fi

アップデート:

コメントごと...サブディレクトリを介して再帰する必要がない場合は、forループでおそらく十分です。

for file in *.txt; do
  if ! rm "$file"; then
    echo "ERROR: failed to remove $file" >&2
  fi
done

または、個々のファイルでエラーを生成する粒度が必要ない場合:

rm *.txt || echo "ERROR" >&2

これ以上小さくすることはできないと思います。:-P

于 2012-08-22T04:37:20.717 に答える
1

まず、「以下に類似」には、文字列リテラルの前後に両方の引用符が含まれていると想定しています。FAILEDそうでない場合は、おそらく最初に修正する必要があります。

前のプロセスが終了する前に開始する可能性はほとんどありませんバックグラウンドで何かを実行するためcaseに使用することを除いて、それはUNIXの方法ではありません:-)&

最初にすべきことは、caseステートメントを次のように置き換えることです。

rc=$?
case $rc in
    0) status="SUCCESS";;
    *) status="FAILED"; echo rc=$rc;;
esac

戻りコードが実際に何であるかを確認します。次に、(パイプラインの最後のものの終了コードである)を調べてman xargs$?考えられる値とその考えられる原因を示します。例えば:

EXIT STATUS
    xargs exits with the following status:
         0 if it succeeds
       123 if any invocation of the command exited with status 1-125
       124 if the command exited with status 255
       125 if the command is killed by a signal
       126 if the command cannot be run
       127 if the command is not found
         1 if some other error occurred.
    Exit codes greater than 128 are used by the shell to indicate
    that a program died due to a fatal signal.
于 2012-08-21T02:47:29.640 に答える