繁体   English   中英

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

[英]How to list all the folder in a folder and exclude a specific one

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

我的文件夹

====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 字符用作文件名分隔符,通过使用-d ""将分隔符指定为 NUL 字符,文件名在read内置函数中再次拆分。
  • 然后将文件名(带双引号)一一存储在数组ary
  • 最后echo "[${ary[*]}]"命令打印出由IFS分隔的ary元素。 整个输出被方括号[]包围。
  • 最后一行被parens ()包围,要在子进程中执行。 目的只是不覆盖当前的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"

希望这可以帮助。

在 bash 中,这可以按如下方式完成,它很接近,但在一行中不起作用。

将内部字段分隔符更改为新行而不是空格。 这允许忽略目录名称中的空格。

然后执行以下操作:

  • 列出目录,每行一个
  • 使用grep删除要排除的目录
  • 迭代结果:

    • 输出去掉最后一个字符的目录名
  • 将所有内容通过管道传输到 xargs 以重新组合成一行并存储在 $var 中

  • 从 ${var} 中修剪最后一个,并用 '[]' 换行
IFS=$'\n'
var=`for d in \`ls -d1 */ | grep -v exclude_dir \`; do  echo '\"'${d::-1}'\",' ; done | xargs`
echo '['${var::-1}']'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM