【问题标题】:Count number of lines in each directory计算每个目录中的行数
【发布时间】:2018-05-29 18:26:32
【问题描述】:

我的目录结构如下

输出/a/1/multipleFiles
输出/a/2/multipleFiles
输出/a/3/multipleFiles
输出/b/1/multipleFiles
输出/b/2/multipleFiles
输出/b/3/multipleFiles

我想知道每个目录的行数。所以基本上,每个最里面的目录级别而不是文件级别的行数。最里面的目录 1、2、3 是我们为分析生成的不同类型的输出,其中包含多个 hadoop part-xxxx 文件。

我移到输出目录并尝试了以下命令。

find . -maxdepth 2 -type d -name '*' | awk -F "/" 'NF==3' | awk '{print $0"/*"}' | xargs wc -l

但是我得到一个错误

wc: ./a/1/*: No such file or directory
wc: ./a/2/*: No such file or directory
wc: ./a/3/*: No such file or directory

但如果我尝试

wc -l ./a/1/*

我得到了那个特定文件夹的正确输出。

我在这里错过了什么。

编辑:

我更新了我的命令如下,以删除不必要的 awk 命令。

 find . -mindepth 2 -maxdepth 2 -type d -name '*'  | xargs wc -l

这再次导致错误

wc: ./a/1: Is a directory 
wc: ./a/2: Is a directory 
wc: ./a/2: Is a directory

【问题讨论】:

  • .a/1/*./a/1/* 不同(. 之后的斜线)...您能解释一下 awk 命令在 find 输出中的用途吗? -mindepth 会不会有帮助?
  • glob 通配符,例如 * 被 xargs 解释为原样,没有扩展 --- 因此您看到的错误。
  • 您是要计算每个目录中所有文件的行数,还是要计算每个目录中的文件数或每个目录中的文件和目录数或其他?请edit您的问题包括简洁、可测试的样本输入和预期输出,以澄清您正在尝试做的事情,因为现在我们必须尝试弄清楚您想要做的只是一个不做任何事情的脚本你想做吗!
  • @EdMorton:每个最里面的子目录都是我们生成的一些分析的输出,这个最里面的目录有多个hadoop part-xxxx文件,所以我需要统计每个分析填充的记录数,需要发送该值以进行进一步验证。
  • @Sundeep:更新了我的 qsn,谢谢。 find 之后 awk 的目的是,当我运行 find 时,它会列出所有目录和子目录。是的 -mindepth 将有助于排除最上面的目录。

标签: unix awk xargs wc


【解决方案1】:

试试execdir,例如:

find . -maxdepth 2 -type f -execdir wc -l {} \;

这将仅在找到文件的目录中运行命令wc -l {},来自man:

 -execdir The -execdir primary is identical to the -exec primary with 
          the exception that utility will be executed from the 
          directory that holds the current file.

【讨论】:

  • 找到 . -mindepth 2 -maxdepth 3 -type f -execdir wc -l {} \;这部分工作,但为每个值提供计数。有什么办法可以让我获得整个目录的计数,而不是单个文件。
  • @Abhinay 可能会将输出通过管道传输到 awk,例如:| awk '{sum +=$1} END { print sum}'
猜你喜欢
  • 2013-02-19
  • 2022-07-21
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 2020-02-29
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多