我有一个正在尝试优化的脚本xargs
。当前版本使用find
with-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
给以提取它。如果我需要在扩展属性中grep
搜索具有多个匹配项的文件,也存在顺序有多个命令的情况。问题是输出:
find -type f -iname "*.mp4" -print0 | xargs -0 getfattr -d --absolute-names
未以grep
会以这种方式过滤的方式格式化。这确实适用于该-exec
方法。我可以将附加选项传递给xargs
或传递一些附加命令,这些命令将格式化输出以使 grep 正确复制 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"
如果我尝试使用该方法grep
的输出,例如质量值为“10”,我将得到如下结果:find
+
# 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 仍然有输出打印 post-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"
这是预期的行为。