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するファイルの数が増え続ける追加のファイルが蓄積されます。
全体的に見て、最高のパフォーマンスの向上は、元の問題を引き起こしたアプリケーションを修正することです。