linux - 如何列出文件夹中的所有文件夹并排除特定文件夹

标签 linux bash shell

假设我有一个像这样的文件夹:

我的文件夹

====my_sub_folder_1

====my_sub_folder_2

====my_sub_folder_3

====排除

我想要一个返回如下字符串的命令:

["my_sub_folder_1", "my_dub_folder_2", "my_dub_folder_3"]

(注意排除了 excude 文件夹)

我能做到的最好的是:

ls -dxm */

返回以下内容。

my_sub_folder_1/, my_dub_folder_2/, my_dub_folder_3/

所以我仍在尝试删除每个文件夹末尾的/,添加 [] 和“”。

如果可能的话,我想在一行中执行此操作,以便我可以直接放入 shell 变量,否则我会将其放入 .sh 文件中,该文件将返回我正在尝试构建的字符串。 (我不知道最后一部分是否真的可能)。

最佳答案

假设您正在 my_folder 所在的目录中执行脚本 属于,怎么样:

while IFS= read -r -d "" f; do
    ary+=("$f")
done < <(find "my_folder" -maxdepth 1 -mindepth 1 -type d -not -name "exclude" -printf "\"%f\"\0")

(IFS=","; echo "[${ary[*]}]")

[说明]

    find 命令的
  • -printf 选项指定输出格式。格式"\"%f\"\0" 打印由以下内容包裹的文件名(不包括主目录名称) 双引号,后跟 NUL 字符 \0
  • NUL 字符用作文件名分隔符和文件名 通过指定分隔符在内置的 read 中再次分割 使用 -d "" 转换为 NUL 字符。
  • 然后文件名(带双引号)存储在数组 ary 中 一一。
  • 最后echo "[${ary[*]}]"命令打印出ary的元素 由 IFS 分隔。整个输出由方括号 [] 包围。
  • 最后一行由括号 () 包围,在子进程中执行。 目的只是不覆盖当前的 IFS

如果您将我的答案中的脚本保存为 my_script.sh,那么您可以分配 将变量 MY_VAR 添加到输出:

MY_VAR=$(./my_script.sh)
echo "$MY_VAR"
# or another_command "$MY_VAR" or whatever

或者,您可以通过修改在脚本内分配变量 最后一行为:

MY_VAR=$(IFS=","; echo "[${ary[*]}]")
echo "$MY_VAR"

希望这有帮助。

关于linux - 如何列出文件夹中的所有文件夹并排除特定文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59605601/

相关文章:

linux - 如何确保可以终止由 Docker 入口点启动的进程?

linux - 我可以在 Linux 系统上检索硬盘驱动器诊断信息吗?

linux - 在 linux 中不使用 shell 更改目录?

linux - 从 jar 中提取 txt 文件

bash - 对数千个文件进行更快的迭代

Bash 脚本手动运行,但在 crontab 上失败

html - 不以任何方式修改 HTML 的命令行 HTML 格式化程序,只是缩进?

linux - 我应该对同一文件上的并行 sed 执行进行竞争条件检查吗?

java - Debian 3.16 上缺少 libswt-gtk-3349.so

c - Ubuntu Box 上的应用程序分析