【问题标题】:Unix Find directories containing more than 2 filesUnix 查找包含超过 2 个文件的目录
【发布时间】:2019-12-09 09:19:33
【问题描述】:

我有一个包含一千多个子目录的目录。我只想 'ls' 包含超过 2 个文件的所有目录。我不需要包含少于 2 个文件的目录。这是在 C-shell 中,而不是 bash。有人知道这方面的好命令吗?

我试过这个命令,但它没有给出想要的输出。我只是想要包含 2 个以上文件的目录的完整列表。它不起作用的一个原因是因为它会进入这些目录中的子目录以查找它们是否有超过 2 个文件。我不想要递归搜索。只是它们所在的主目录中的一级目录列表。

$ find . -type f -printf '%h\n' | sort | uniq -c | awk '$1 > 2'

【问题讨论】:

  • 我会使用find . -d 来查找和打印目录。我会将它传送到一个循环中,该循环在它找到的每个目录上执行ls -1 并将其传送到wc -l 并在变量中捕获输出。然后我可以测试该变量,如果大于 2,我将再次在目录上重新运行 ls,而不重定向输出。要将搜索限制在顶级目录,我会将-depth -2 添加到find 命令。但我不是 csh 程序员,所以我不能告诉你如何在 csh 中编写循环。

标签: unix csh


【解决方案1】:

我的错误,我想的是 bash 而不是 csh。虽然我没有要测试的 csh,但我认为这是同一事物的 csh 语法:

foreach d (*)
  if (d "$d" && `ls -1 "$d"|wc -l` > 2) echo "$d"
end

我添加了一个保护,这样非目录就不会被不必要地处理,并且我已经包含了双引号,以防有任何“有趣”的文件或目录名称(例如包含空格)。

一个可能的问题(我不知道您的确切任务是什么):任何直接子目录也将被视为文件。

对不起,我在这里用 bash 工作:

for d in *;do if [ $(ls -1 $d|wc -l) -gt 2 ];then echo $d;fi;done

如果您使用的是纯 Unix,则可以通过解构目录本身的格式来尝试“作弊”,以获得更快的解决方案。它们只是文件本身,其中包含可以在这种情况下进行分析的内容。不用说,这不是便携的,例如任何在 Windows 上运行的 bash,因此不推荐。

【讨论】:

  • 当我尝试这个时,它给了我一个非法变量名的错误。会不会是因为 C-shell 的语法错误?
  • @JeffY :尽管 OP 将问题标记为 Shell,但无论出于何种原因,他都明确表示希望看到 csh 解决方案。
猜你喜欢
  • 2010-10-17
  • 2015-04-06
  • 1970-01-01
  • 2012-06-28
  • 2014-11-28
  • 2015-04-18
  • 2012-09-24
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多