【发布时间】:2020-10-01 17:17:43
【问题描述】:
我有一个脚本,我正在尝试使用xargs 进行优化。当前版本使用find和-exec调用命令:
find -type f -iname "*.mp4" -print0 -printf '\n' -exec getfattr -d --absolute-names {} \;
之后,我可以通过管道发送到grep,例如:
grep -z -P user\.md5\=\"$input_search_hash\"
过滤结果,同时使用-z 保留整个输出。
我需要从getfattr 返回的整个输出按文件“保留”,因为我需要具有匹配扩展属性的文件名,然后将其传递给sed 以提取它。在某些情况下,如果我需要在扩展属性中搜索具有 multiple 匹配项的文件,我会依次执行多个 grep 命令。问题是输出:
find -type f -iname "*.mp4" -print0 | xargs -0 getfattr -d --absolute-names
的格式不是grep 将以这种方式过滤。这确实适用于-exec 方法。我可以将附加选项传递给xargs 或在一些附加命令中通过管道格式化输出以使grep 正确复制-exec 的行为吗?我猜在喂给grep 之前我需要某种换行符,就像-printf '\n' 在-exec 方法中所做的那样。我只会使用getfattr 来“搜索”扩展属性,而不需要grep 输出,但它无法通过提供 xattr 名称和值来做到这一点。
示例
输入来自find 命令,该命令是任意目录结构中的视频文件列表。对于每个文件,每个getfattr 命令的输出是这样的:
# file: /path/to/file/test.mp4
user.md5="0e29a7f555af518872771689e28d998d"
user.quality="10"
user.sha256="d49ba58e3b30f4ef8c81d19ce960edcf6552977bb8adb79b5b9a677ba9a54b2b"
user.size="1645645"
如果我尝试使用+ 方法find 的输出grep,例如质量值为“10”,我将得到如下结果:
# file: /path/to/file/test.mp4
user.md5="8cf97b888e6fdbed27b02233cd6779f5"
user.quality="12"
user.sha256="613d16b2a0270e2e5f81cfd58b1eacf710a65b82ce2dab49a1e415275440f429"
user.size="1645645"
# file: /path/to/file/test1.mp4
user.md5="3c5a39f1ceefce1e124bcd6786a99155"
user.quality="10"
user.sha256="0d7128a7642d24ea879bbfb3de812b7939b618d8af639f07d5104c954c8049c3"
user.size="5674567"
# file: /path/to/file/test2.mp4
user.md5="0e29a7f555af518872771689e28d998d"
user.quality="6"
user.sha256="d49ba58e3b30f4ef8c81d19ce960edcf6552977bb8adb79b5b9a677ba9a54b2b"
user.size="15645"
所有 文件find 定位被返回并且要从grep 搜索的字符串,在这个例子中user.quality="10",被突出显示,但是其他文件test.mp4 和test2。 mp4 仍然在 grep 后打印输出。换句话说,find 可以找到 1000 个 mp4 文件,其中可能有 20 个具有 user.quality="10" 条目,但即使应用 grep 搜索该字符串仍然返回 1000 个文件名(在 sed 之后)。
这不会在使用\; 时发生。我从grep 得到的唯一结果是:
# file: /path/to/file/test.mp4
user.md5="3c5a39f1ceefce1e124bcd6786a99155"
user.quality="10"
user.sha256="0d7128a7642d24ea879bbfb3de812b7939b618d8af639f07d5104c954c8049c3"
user.size="5674567"
这是预期的行为。
【问题讨论】:
-
您能否添加一个具有预期输入(目录结构)和预期输出的示例?
-
我添加了一个例子来说明我的意思。
标签: linux bash grep xargs xattr