情况:
在 Linux 中,我有一个父文件夹,里面有 22 个不同名称的文件夹,每个文件夹都有一个特定名称的文件asset.xml
。这些文件夹中还有数百个其他文件夹asset.xml
,但这些是以前的版本,我对它们不感兴趣。我需要在每个文件中搜索 3 个标签"legend|assetID|name"
并返回这些标签内的信息。它们通常在同一行,所以我认为Grep
没问题。
我尝试过的:
grep -nr -E "legend|assetID|name" . > /dir/to/the/ReportFile.txt
这会花费太长时间并返回太多重复的数据,因此不切实际。
find . -maxdepth 2 -exec grep -E "legend|assetID|name" . > /dir/to/the/ReportFile.txt
这返回了一个错误,其中 -exec 缺少一个参数,因此输出文件为空。
find . -maxdepth 2 -| grep -E "legend|assetID|name" . > /dir/to/the/ReportFile.txt
这将返回一个空的输出文件。
问题: 我如何遍历各个不同名称的文件夹内的每个同名文件(其中还有其他包含同名文件的子文件夹)并提取 3 个标签内的信息并将这些数据写入输出文件?
答案1
我刚刚找到了解决方案。
grep -nr -E "legend|assetID|name" /dir/to/the/*/asset.xml > /dir/to/the/ReportFile.txt
路径中的*
是我需要遍历每个目录的“通配符”。我认为它只会进入该目录,而不会进入任何更深的文件夹……?
答案2
您的命令行find
几乎是正确的:-)
找到的文件find
用 表示{}
。-exec
find 命令行的部分必须以某种方式完成,\;
通常用 或 更好,只+
调用grep
一次,我建议你grep
只在普通文件上运行-type f
,尝试
find . -maxdepth 2 -type f -exec grep -E "legend|assetID|name" {} + > ../output
您可能需要指定文件名asset.xml
find . -maxdepth 2 -type f -name asset.xml -exec grep -E "legend|assetID|name" {} + > ../output
使用以下方法检查结果
cat ../output
您可能需要将 maxdepth 修改为 3 或任何合适的值。