如何获取自动找到的所有子文件夹的逗号分隔文件列表?
如何获取自动找到的所有子文件夹的逗号分隔文件列表?
我想要一个包含各个子文件夹的文件列表。
由于子文件夹不断添加,我需要自动更新子文件夹列表。
例如,我已经添加了子文件夹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
。
问题的出现原因:
作者想要解决的问题是如何获取所有子文件夹中的文件,并将它们以逗号分隔的形式列出。作者发现了一个解决方案,该方案可以自动找到所有子文件夹中的文件,无需事先检查子文件夹。
解决方法:
作者提供了一个解决方案的代码段,可以自动找到所有子文件夹中的文件,并将它们以逗号分隔的形式列出。该代码段使用了以下命令和工具: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命令)。
以上是作者提供的解决方案,可以自动找到所有子文件夹中的文件,并将它们以逗号分隔的形式列出。
问题的出现的原因是用户想要获取所有子文件夹中的文件,并将它们以逗号分隔的列表形式呈现。然而,用户不知道子文件夹的名称,希望能自动获取。
解决方法之一是使用大括号扩展来创建三个独立的通配符,以扩展文件列表。代码如下:
files=(DIR/*/*.{html,md,pdf})
解决方法之二是使用KSHGLOB
选项来创建一个通配符,以扩展文件列表。代码如下:
setopt KSHGLOB files=(DIR/*/*.@(html|md|pdf))
感谢您的回答。但是您的回答假设我已经知道子文件夹的名称。我想获取我不知道的子文件夹中的文件(并且不想手动输入子文件夹的名称)。
实际上,以上解决方法并不假设用户已知子文件夹的名称。其中DIR/*/
匹配子文件夹,DIR/*/*.html
匹配每个子文件夹中具有.html
扩展名的文件。