![查找某个目录下所有具有特定内容的*.xml.err文件,需要将*.xml文件移动到其父目录并删除*.xml.err文件](https://linux22.com/image/194369/%E6%9F%A5%E6%89%BE%E6%9F%90%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%89%80%E6%9C%89%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E5%86%85%E5%AE%B9%E7%9A%84*.xml.err%E6%96%87%E4%BB%B6%EF%BC%8C%E9%9C%80%E8%A6%81%E5%B0%86*.xml%E6%96%87%E4%BB%B6%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%85%B6%E7%88%B6%E7%9B%AE%E5%BD%95%E5%B9%B6%E5%88%A0%E9%99%A4*.xml.err%E6%96%87%E4%BB%B6.png)
我正在尝试编写一个 Linux shell 命令,但卡在这里。
这是背景:
系统会生成.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 {} +
我试图通过使用 find 的多个 -execdir 参数来删除 -for 循环来优化性能。
find /home/tmp -name \*.err -type f -path "*not_processed*" -execdir grep -l -i "oracle" {} \; -execdir mv {} .. \; -execdir rm -rf {} \;
但是,我被困住了,-execdir mv {} .. \;
我无法删除第二个扩展名.err
。 {} 应该是包含文件路径的数组,例如./a.xml.err ./b.xml.err
.我尝试简单地.err
在 {} 后面添加,即-execdir mv {}.err .. \;
可以得到./a.xml.err.err ./b.xml.err.err
.现在我知道如何添加.err
扩展名,但仍坚持删除.err
{} 的扩展名。
预先感谢您,您的努力将得到赞赏。
答案1
您正在为每个文件创建一个新的 shell。
您可以通过(正确)find
将 的输出通过管道传输到read
循环并在其中进行操作来获得一些性能。
否则,恐怕爬行拥挤的树结构会很昂贵,而且,这听起来好像您会积累其他.err
文件,而这些文件只会不断增加要 grep 的文件数量。
总而言之,您会发现最好的性能改进是修复产生原始问题的应用程序。