我一直在使用strings
提取和比较目录之间的文件版本。
我似乎无法递归地执行此操作。
我对每个文件使用的方法是:
strings -e l FILENAME.exe | sed -e :a -e '/FileVersion$/N; s/FileVersion\n/FileVersion /; ta' | grep FileVersion | cut -d ' ' -f 2
删除文件名并替换为 * 有效。但我只得到文件版本,没有文件名。包括 -F 给我字符串的文件名。
但我不明白如何格式化 Sed / Grep 来仅收集文件名和版本号。
答案1
听起来你想打印以 结尾的行FileVersion
,所以它应该只是一个问题:
strings -f -e l -- *.exe | sed -n '/FileVersion$/{n;p;}'
答案2
你可以这样做:
strings -e l -f FILENAME.exe | sed -n -e :a -e '/FileVersion$/,/.*/{/FileVersion$/d;/.*/p}'
这将使 sed 不会打印任何“-n”行,除了用 p 告诉它的行之外。然后你告诉它找到以 FileVersion 结尾的行和下一个模式,因为结束模式是 .* 它将匹配下一行:)。然后,您告诉它删除 FileVersion 行并打印其余部分,其中将包含您的版本:)。
答案3
这只是对 cut 和 sed 的使用理解不好。
对一个衬里稍作调整:
strings -f -e l *.exe | sed -e :a -e '/FileVersion$/N; s/FileVersion\n/FileVersion /; ta' | grep FileVersion | sed 's/.*FileVersion//'
因此字符串使用 -f 作为文件名,使用 -e 作为必要的文件信息。
sed 用于剥离并保留文件版本
然后 grep 将该信息定位到屏幕上
然后最后一个 sed 在 Fileversion 之前删除内容(这不是正确的方法,我发现理解 sed 的模式很复杂)
sed 's/.*FileVersion//'
如果有人想发布 sed 的正确格式,我会很乐意更新它。不幸的是,对 sed 的模式和理解并没有完全理解。