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

How to get a comma separated list of files of all subfolders which are found automatically?

我想要一个包含各个子文件夹中所有文件的列表。 由于不断添加子文件夹,因此我需要自动更新子文件夹列表。

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

#!/bin/zsh
# I get all the subfolders of the folder DIR automatically as a list.
folder=$(ls -l DIR/ | awk '/^d/ { print  }' | tr '\n' ',' | sed 's/,$//g' )
echo "Folder: $folder"
# --> html,md,pdf

# Now get the files of the found subfolders
files=$(ls -m DIR/{$folder}/*)
echo "Files: $files"
# DOES NOT WORK

# this works instead:
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

我找到了解决办法。自动找到所有子文件夹中的所有文件。无需先检查子文件夹。

files=$(ls -R DIR | awk '
  /:$/&&f{s=[=10=];f=0}
  /:$/&&!f{sub(/:$/,"");s=[=10=];f=1;next}
  NF&&f{ print s"/"[=10=] }' | tr '\n' ',' | sed 's/,$//g' )

它基于 并稍作修改(管道连接到 tr,最后使用 sed)。

当你有适当的数组时,你不需要逗号分隔的列表(如果元素可以包含逗号,它就没有多大用处)。

使用大括号扩展创建三个单独的 glob 进行扩展

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

或使用 KSHGLOB 选项创建一个 glob

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