Bash - 递归查找目录及其子目录中所有文件类型的好方法是什么?

Bash - What is a good way to recursively find the type of all files in a directory and its subdirectories?

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

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

所以当调用脚本时,路径作为参数传递。然后在路径中搜索非目录,并使用命令文件输出它们的类型。 但是,这种递归和子目录如何实现呢? 我也通过遍历 ls -R 来尝试它,但是文件夹的名称仍然被附加,我无法再通过我的方式检查它是文件夹还是文件。 编辑:我无法使用 find!

我很高兴能得到任何帮助!

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

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

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

也就是说,我将其修改为接受用户输入,如下所示:

#!/bin/bash

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

recurse 

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

建议

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

解释:

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

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

  3. 忽略 find permission/access 错误 2>/dev/null

  4. 运行 file 对每个找到的文件执行命令。