如何获取自动找到的所有子文件夹的逗号分隔文件列表?

11 浏览
0 Comments

如何获取自动找到的所有子文件夹的逗号分隔文件列表?

我想要一个包含各个子文件夹的文件列表。

由于子文件夹不断添加,我需要自动更新子文件夹列表。

例如,我已经添加了子文件夹html,pdf,md

#!/bin/zsh
# 我自动将文件夹DIR的所有子文件夹获取为一个列表。
folder=$(ls -l DIR/ | awk '/^d/ { print $9 }' | tr '\n' ',' | sed 's/,$//g' )
echo "文件夹: $folder"
# --> html,md,pdf
# 现在获取找到的子文件夹中的文件
files=$(ls -m DIR/{$folder}/*)
echo "文件: $files"
# 无法正常工作
# 可以尝试以下方法:
ls -m DIR/{html,md,pdf}/*

ls命令中手动输入子文件夹的名称可以正常工作。

我希望从$files中获得的输出是(示例):

DIR/html/dataStorage.html, DIR/md/dataStorage.md, DIR/pdf/data.pdf, DIR/pdf/dataStorage.pdf

我在使用zsh

0
0 Comments

问题的出现原因:

作者想要解决的问题是如何获取所有子文件夹中的文件,并将它们以逗号分隔的形式列出。作者发现了一个解决方案,该方案可以自动找到所有子文件夹中的文件,无需事先检查子文件夹。

解决方法:

作者提供了一个解决方案的代码段,可以自动找到所有子文件夹中的文件,并将它们以逗号分隔的形式列出。该代码段使用了以下命令和工具:ls、awk、tr和sed。代码段中的命令和工具的具体用法和作用如下:

- ls -R DIR:递归列出指定目录(DIR)下的所有文件和文件夹。

- awk '/:$/&&f{s=$0;f=0} /:$/&&!f{sub(/:$/,"");s=$0;f=1;next} NF&&f{ print s"/"$0 }':使用awk命令对ls命令的输出进行处理。该命令的作用是判断每一行是否为子文件夹的标识行,如果是,则将标识行保存为路径字符串(s),并将标志位(f)设为0;如果不是标识行,则将路径字符串(s)与当前行拼接,并输出结果。

- tr '\n' ',':将输出结果中的换行符替换为逗号。

- sed 's/,$//g':去除输出结果中最后一个逗号。

还有一个参考链接,该链接是解决方案的基础,并进行了一些修改(在最后使用了tr和sed命令)。

以上是作者提供的解决方案,可以自动找到所有子文件夹中的文件,并将它们以逗号分隔的形式列出。

0
0 Comments

问题的出现的原因是用户想要获取所有子文件夹中的文件,并将它们以逗号分隔的列表形式呈现。然而,用户不知道子文件夹的名称,希望能自动获取。

解决方法之一是使用大括号扩展来创建三个独立的通配符,以扩展文件列表。代码如下:

files=(DIR/*/*.{html,md,pdf})

解决方法之二是使用KSHGLOB选项来创建一个通配符,以扩展文件列表。代码如下:

setopt KSHGLOB
files=(DIR/*/*.@(html|md|pdf))

感谢您的回答。但是您的回答假设我已经知道子文件夹的名称。我想获取我不知道的子文件夹中的文件(并且不想手动输入子文件夹的名称)。

实际上,以上解决方法并不假设用户已知子文件夹的名称。其中DIR/*/匹配子文件夹,DIR/*/*.html匹配每个子文件夹中具有.html扩展名的文件。

0