我正在尝试编写一个 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 的文件数量。
总而言之,您会发现最好的性能改进是修复产生原始问题的应用程序。