查找某个目录下所有具有特定内容的*.xml.err文件,需要将*.xml文件移动到其父目录并删除*.xml.err文件

查找某个目录下所有具有特定内容的*.xml.err文件,需要将*.xml文件移动到其父目录并删除*.xml.err文件

我正在尝试编写一个 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 的文件数量。

总而言之,您会发现最好的性能改进是修复产生原始问题的应用程序。

相关内容