【问题标题】:Adding server hostname to each line of 'find' output将服务器主机名添加到“查找”输出的每一行
【发布时间】:2015-08-24 21:18:07
【问题描述】:

我需要服务器上具有特定扩展名的所有文件的列表。我需要它来显示服务器主机名、文件大小和文件的绝对路径。

echo $(hostname); find $(pwd) / -iname *.jpg -exec du -s {} \;

echo $(hostname); find $(pwd) / -iname *.jpg|xargs du -s

几乎可以到达:
joes_server
5473 /home/joe/pics/sunset.jpg
8522 /home/ joe/pics/mountains.jpg

我不知道如何在查找输出的每一行中包含主机名。我尝试将主机名函数添加到 xargs 或 -exec 部分会导致错误,因为它会尝试将主机名应用于查找的输出。

有没有办法在查找输出的每一行中包含主机名?

当循环通过许多服务器时,我希望有如下输出:
joes_server 5473 /home/joe/pics/sunset.jpg
joes_server 8522 /home/joe/pics/mountains.jpg
ma​​rys_server 5398 /home/mary/snapshots/background.jpg
janes_server 9642 /home/jane/pictures /flowers.jpg

谢谢

【问题讨论】:

  • 通过 sed/awk 运行 du 输出并将它们放入服务器名称中。您将无法在此之前执行此操作,因为您的 find 将寻找不存在的 joes_server 5473/etc...
  • 如果find 为此添加了-print 令牌会很好。

标签: linux bash command-line


【解决方案1】:
find "$PWD" / -iname '*.jpg' -exec du -s {} + | sed "s/^/$(hostname): /"

(但是,正如@chepner 在下面指出的那样,同时拥有/"$PWD" 是多余的;从/ 中的查找最终会访问您当前的工作目录,因此您可以省略"$PWD"。或者如果您只想从您所在的位置开始查看,只需执行 find "$PWD" 并离开 /。)

变化:

  1. 使用 $PWD 而不是 $(pwd) - 当 bash 已经为您将命令放入参数中时,无需运行命令

  2. 报价!引用!报价!

  3. find -exec 上使用+ 而不是;,这样每次调用du 时都会传递多个文件;这样更有效率。如果你的find版本在这里不支持+,你可以使用-print0 | xargs -0 du -s

  4. 将整个内容通过sed 插入,以在每行的前面插入主机名。

【讨论】:

  • 感谢您的解释以及您的解决方案。我知道足够的基本 Linux 来完成我的简单工作。我指出的坏习惯是当有人不知道如何正确解释他们拼凑在一起的 Google 结果时,你会得到什么。
  • "$PWD"/ 之一可以省略;前者如果你真的想搜索整个文件系统,后者如果你真的想限制搜索到当前目录。
  • 知道perl -pe 's{^}{}g' 的等价物是什么。我通常使用 perl 而不是 sed,并且宁愿不将 sed 添加到我的工具链中;)
  • perl -pe "s/^/$(hostname): /" 也有效。或者 perl -pe "s{^}{$(hostname): }" 如果您更喜欢这些分隔符。 shell 正在做将$(hostname) 转换为实际主机名的工作(这就是为什么您需要使用双引号而不是单引号的原因);到 sedperl 获取字符串时,它都是文字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
相关资源
最近更新 更多