shell获取文件夹下所有目录路径,包括子目录

在Shell中,要获取一个文件夹及其所有子目录的路径,你可以使用find命令配合 -type d 参数,这个参数用来查找类型为目录(directory)的项。下面是一个简单的例子:

Bash
find /path/to/directory -type d
这条命令会列出 /path/to/directory 下的所有子目录的相对路径。如果你想获取每个目录的完整(绝对)路径,可以在前面添加. 或者使用 pwd 命令结合 -exec 参数来实现:

Bash
find /path/to/directory -type d -exec printf "%s/\n" {} \;
或者

Bash
find /path/to/directory -type d -exec realpath {} \;
上面的命令中:

find 是查找命令。
/path/to/directory 是你想要查找的目录路径。
-type d 指定只查找目录。
-exec 后面跟着命令,这里使用 printf "%s/\n" 或 realpath 来打印出每个找到的目录的绝对路径。
printf "%s/\n" 会打印目录名并确保每个目录名后面都有一个斜杠(适用于大多数情况)。
realpath 会给出目录的真实、绝对路径,尤其对于符号链接特别有用,它会解析出实际指向的目录。
如果在没有realpath命令的情况下,可以组合使用pwd和dirname来达到类似效果:

Bash
find /path/to/directory -type d -exec bash -c 'echo "$(pwd)/$1"' _ {} \;
这会在每个找到的目录上下文中运行一个子 shell,打印出包含当前工作目录(pwd)与找到的目录名组合而成的绝对路径。其中_是一个占位符,{}会被替换为 find 找到的每个目录名。

如果需要跳过某些文件夹呢,比如隐藏文件夹和指定的文件夹,比如 media 文件夹?

如果你想在查找过程中跳过隐藏目录(即名称以. 开头的目录)和指定的文件夹(如 media),可以使用-not -path 条件进行排除。下面是一个示例:

Bash

Find /path/to/directory \( \
    -not -path '*/\.*' -and \
    -not -path '*/media*' \
\) -type d -exec printf "%s/\n" {} \;

或者,如果你只想排除隐藏目录
Find /path/to/directory -not -path '*/\.*' -type d -exec printf "%s/\n" {} \;
这里:

-not -path '/.' 表示排除任何路径中包含以. 开头的目录(隐藏目录)。
-not -path '/media' 表示排除任何路径中包含 media 的目录。
两者之间使用-and 连接,表示同时满足这两个条件的才会被筛选出来。

然后,-exec printf "%s/\n" {} ; 或 -exec realpath {} ; 依旧用于输出目录的完整路径。

请注意,-path 匹配的是整个路径,所以 media*会匹配任何包含 media 的路径部分,包括子目录。如果你只想排除名为 media 的顶级目录,可以改为-not -path '/path/to/directory/media'(根据实际情况替换/path/to/directory)。