【问题标题】:Why doesn't this xargs work?为什么这个 xargs 不起作用?
【发布时间】:2025-12-06 22:55:01
【问题描述】:

我一直在尝试使用 redis-cli 获取 redis 数据库中的所有值。 这主要是通过redis-cli keys "*"(返回所有键)并将其传递给redis-cli get(返回键的值)来完成的。

我后来(在 SO 上)发现了一种方法:

echo 'keys YOURKEY*' | redis-cli | sed 's/^/get /' | redis-cli

但在此之前,我尝试过此操作,但 get 命令似乎从未运行过。我做错 xargs 了吗?:

redis-cli keys "*" | xargs -0 -I % redis-cli get "%"

我很欣赏“为什么这不起作用”的问题不受欢迎,但我认为答案将为被 xargs 困惑的人提供信息。

【问题讨论】:

  • “为什么这不起作用”问题是所有好的 * Qs 的基础。但是没有完整信息的 Q 是不受欢迎的,因为您忽略了向我们显示错误消息或其他“它不起作用”的证据;-/,是吗?你知道-0xargs 做了什么吗?检查手册页。可能还有其他问题。祝你好运。
  • 事实证明 -0 标志是问题所在,我将其包括在内是因为我的一些键包含空格,我错误地认为它会解决这个问题。没有进一步的信息,因为命令的后半部分实际上没有输出任何内容。 redis-cli keys "*" | xargs -0 -I % "%" 会输出键名列表,但包含 redis-cli get 会导致输出为空。没有错误信息!

标签: unix redis xargs


【解决方案1】:

您将-0 标志用于xargs,这表示您的输入项以空字符(ASCII 0)而不是空格终止。 redis-cli 命令不太可能以这种格式输出密钥。事实上,它似乎产生了只有一个键/行的输出,像这样:

# redis-cli keys "*"
_tooz_group:central-global
_tooz_beats:38225c46-7ed8-4c2a-b1eb-6400d0f99004
_tooz_beats:bea903f7-ab5d-4503-be19-f2029beece93
_tooz_beats:bd859c91-0245-45cf-a289-23fc25998e97
_tooz_beats:04528af5-dd97-41af-87a6-d7dc0c0d9f5d
_tooz_beats:974b9d9d-86ff-457e-9a5c-e857ec12a915
_tooz_beats:a55cfe65-f344-4ed4-9b9f-a0ace4d8f6d3

如果您从 xargs 调用中删除 -0,它应该可以工作 很好:

# redis-cli keys "*" | xargs -I% redis-cli get %

如果您有包含空格的键,这将不起作用(因为 xargs 期望您的输入数据以空格分隔)。在那里面 在这种情况下,您可以将分隔符显式设置为\n

# redis-cli keys "*" | xargs --delimiter '\n' -I% redis-cli get %

【讨论】:

  • 我的键确实有空格,我添加了 -0 标志,因为我认为它可以解决这个问题。最后一个选项有效,谢谢!
【解决方案2】:

我想你想要这个:

# Set some data
redis-cli set mb1 A
OK

# Set some more
redis-cli set mb2 B
OK

# Check the keys we have
redis-cli keys "mb*"
1) "mb1"
2) "mb2"


#Retrieve those puppies, passing one at a time with "-n 1"
redis-cli keys "mb*" | xargs -n 1 redis-cli get 
"A"
"B"

【讨论】:

    最近更新 更多