特定のディレクトリで特定のコンテンツを含むすべての* .xml.errファイルを見つけるには、* .xmlファイルを親ディレクトリに移動して* .xml.errファイルを削除する必要があります。

特定のディレクトリで特定のコンテンツを含むすべての* .xml.errファイルを見つけるには、* .xmlファイルを親ディレクトリに移動して* .xml.errファイルを削除する必要があります。

Linuxシェルコマンドを作成しようとしていますが、ここで停止しました。

背景は次のとおりです。

システムが作成します.xmlと.xml.errorは次のようになります。/tmp/A/処理済み/tmp/A/not_processed/tmp/B/処理済み/tmp/B/not_processed目次。完全なカタログが定義されていません。例えば/tmp/C /tmp/D...

以下では、コンテンツに「oracle」を含むすべての* .xml.errファイルを見つける必要があります。/tmp/A/not_processedそして/tmp/B/not_processed。次に、* .xmlファイルを親ディレクトリに移動する必要があります。/tmp/Aまたは/tmp/Bそして*.xml.errファイルを削除してください。

以下は問題のないコードです。

find /home/tmp  -name \*.err -type f -path "*not_processed*" -execdir grep -l -i "oracle" {} \; -execdir sh -c '
    for name do
        mv "${name%.*}" ".."
        rm -rf  "$name"
    done' sh {} +

見つけるために、いくつかの-execdir引数を使用して-forループを削除してパフォーマンスを最適化しようとしています。

find /home/tmp  -name \*.err -type f -path "*not_processed*" -execdir grep -l -i "oracle" {} \; -execdir mv {} .. \; -execdir rm -rf {} \;

ただし、-execdir mv {} .. \;2番目の拡張機能を削除することはできません.err。 {}はファイルパスを含む配列でなければなりません。たとえば、{}の後に./a.xml.err ./b.xml.err単に追加しようとしましたが、うまくいきました。これで拡張子を追加する方法がわかりましたが、まだ{}の拡張子を削除しています。.err-execdir mv {}.err .. \;./a.xml.err.err ./b.xml.err.err.err.err

事前に感謝し、あなたの労苦に感謝します。

答え1

各ファイルに対して新しいシェルを作成しています。

findループの出力をreadループに(正しく)接続し、その中で動作すると、ある程度のパフォーマンスが得られます。

.errそうしないと、混雑したツリー構造をクロールするのに費用がかかり、grepするファイルの数が増え続ける追加のファイルが蓄積されます。

全体的に見て、最高のパフォーマンスの向上は、元の問題を引き起こしたアプリケーションを修正することです。

関連情報