【问题标题】:Using BASH, how would one use wc -l on a variable set to the output of a find command? [duplicate]使用 BASH,如何在设置为 find 命令输出的变量上使用 wc -l? [复制]
【发布时间】:2016-05-06 06:28:19
【问题描述】:

警告:我是菜鸟。 无论如何,如果我有 var foo=$(find / \( -name "Test.txt" \)),并且知道使用相同的 find 命令并将输出传送到 wc -l 会给我正确的结果计数;我将如何仅使用foo(不是另一个查找)来计算结果?bash

【问题讨论】:

  • (OT:在 find 命令中不需要 \( … \)。)
  • @chepner - 你是绝对正确的。我一直忘记引用"。我将删除我之前的评论,因为它具有误导性。
  • 如果你想要 100% 的准确率,你不能很容易地做到这一点。文件名可以同时包含空格和换行符,这会与所提供的任何答案混淆。

标签: bash


【解决方案1】:

你可以使用“这里的字符串”:

wc -l <<<"$foo"

(见§3.6.6 "Here Documents" and §3.6.7 "Here Strings" in the Bash Reference Manual。)

【讨论】:

  • 嗯...我试过了,但无论如何它都会返回 1。 echo "找到的文件:" Lang=$( find / -name ".lproj" -not -name "en" -not -name "En*" -not -name "Base*" ) wc -l /dev/null 2>&1 #我不知道我做错了什么...
  • @Nocturnal:尝试运行 echo "$Lang" 。 . .
  • 是的,它正确地找到了文件和所有文件,但只用空格分隔它们,我假设这是问题所在。
  • @Nocturnal:所以,您需要找到其根本原因。您在评论中发布的代码看起来不错。
【解决方案2】:

在 Bash 中,您可以使用此处的字符串:

wc -l <<<"$foo"

传统上,您必须单独使用管道:

printf "%s\n" "$foo" | wc -l

但是,如果可以的话,我建议避免将大型结果存储在变量中。如果目标(如您的一些 cmets 中所建议的)是删除您找到的文件并报告删除了多少,我会做类似的事情

find / -name "*.lproj" -not -name "en*" -not -name "En*" \
  -not -name "Base*" -printf '.' -delete |
wc -c |
sed 's/.*/Found and deleted & files./'

(如果你的find不支持-printf-delete——它们是GNU find的扩展——你需要-exec一些外部实用程序。那么也许你会想要重构整个 sn-p 到在一个简单的 shell 脚本中运行的东西。)

【讨论】:

  • 嗯...我试过了,但无论如何它都会返回 1。 echo "找到的文件:" Lang=$( find / -name ".lproj" -not -name "en" -not -name "En*" -not -name "Base*" ) wc -l /dev/null 2>&1 #我不知道我做错了什么...
  • 那字符串里有什么?
  • 如果foo 为空,您仍然会得到行数 1,因为这里的字符串被换行符隐式终止。
猜你喜欢
  • 1970-01-01
  • 2011-06-06
相关资源
最近更新 更多