【问题标题】:Bash - What is a good way to recursively find the type of all files in a directory and its subdirectories?Bash - 递归查找目录及其子目录中所有文件类型的好方法是什么?
【发布时间】:2022-10-17 09:19:41
【问题描述】:

我对材料不是太深入,很少使用 Bash 脚本。 即使进行了一些研究,我也无法快速学习 Bash 中的所有内容,以便我可以在整个目录及其子目录中搜索文件,然后输出它们的类型。我现在已经对函数的方向有了一些了解,但又不太知道如何递归地执行此操作。另外,我只想考虑文件而不考虑文件夹。 这是我自己已经完成的事情:

for item in "$1"/*
do
    if ! [ -d $item ]; then
        echo $(file $item)
    fi
done;

因此,当调用脚本时,路径作为参数传递。然后在路径中搜索非目录,并将其类型与命令文件一起输出。 但是这个递归又是如何实现子目录的呢? 我也通过迭代 ls -R 进行了尝试,但是文件夹的名称仍然被附加,我无法再通过我的方式检查它是文件夹还是文件。 编辑:我不能使用查找!

我很高兴有任何帮助!

【问题讨论】:

  • 试试这个find . -type f -exec file {} +
  • 对不起,我忘记写了。我不能使用查找:/
  • 哼! bash 的目标是什么版本?重击4+?
  • 这不一定是关于那个,而是关于学习和练习。用 find 它只是一个单行,是的
  • find 绝对是最好的方法。只需使用find。在将所有这些文件传递给 file 时,在大型目录树 (file **) 上使用递归全局扩展可能会超过系统的 ARG_MAXfind 为您处理此问题。您可以使用xargs 来管理它,但我看不出有什么好的理由,除非可能运行并行file 进程。

标签: bash shell file recursion


【解决方案1】:

您可以使用 bash 扩展的通配功能:

$ shopt -s dotglob globstar
$ for i in **/*; do [ -d "$i" ] && continue; file "$i"; done

【讨论】:

  • 首先感谢您的解决方案建议。通过对路径规范的小幅优化,它可以工作,但我很困惑。现在 globstar 在哪里使用,这真的是递归的吗?我没有看到自呼叫
  • globstar 是 Bash 选项,请参阅 man bash。什么是自调用?
  • 顺便说一句,您可以使用help sethelp shopt 获得更多有用的帮助。
  • 谢谢!递归描述了一个函数再次调用自身以达到期望的目标
  • 稍微简化一下:for i in **/*; do [ ! -d "$i" ] && file "$i"; done
【解决方案2】:

这可能会有所帮助:How to recursively list subdirectories in Bash without using "find" or "ls" commands?

也就是说,我对其进行了修改以接受用户输入,如下所示:

#!/bin/bash

recurse() {
 for i in "$1"/*;do
    if [ -d "$i" ];then
        echo "dir: $i"
        recurse "$i"
    elif [ -f "$i" ]; then
        echo "file: $i"
    fi
 done
}

recurse $1

如果您不想要文件部分(看起来您不想要),那么只需删除 elif 和它下面的行。我把它留在原来的帖子里也有。希望这可以帮助。

【讨论】:

  • 非常感谢,但我有以下问题:`如果! [ -d "$i" ];然后 echo $(file §i) else recurse "$i"' 我的输出是 3x 目录,这不是真的,我需要文件,nit 目录:/
【解决方案3】:

建议

   file $(find -type f 2>/dev/null)

解释:

  1. find 递归搜索到当前文件夹的命令。

  2. 仅过滤来自find 命令的文件:-type f

  3. 使用2>/dev/null 忽略任何find 权限/访问错误

  4. 在每个找到的文件上运行 file 命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2017-04-03
    • 2011-10-10
    • 2010-09-12
    • 2012-03-10
    • 2012-07-22
    • 2017-03-15
    相关资源
    最近更新 更多