以逗号分隔所有目录并将输出发送到其他脚本

mjs*_*ier 24 linux bash

我们使用phpDocumentator来记录我们的PHP代码.php代码在不同的词典中.运行phpDocumentator的脚本如下所示:

./phpdoc -d dir1,dir2,dir3,dir4 
Run Code Online (Sandbox Code Playgroud)

每次我们添加一个新目录时,我都要将这个添加到脚本中.

我想动态地这样做.

ls -d ../*test* 
Run Code Online (Sandbox Code Playgroud)

这列出了所有需要的目录,但空格分隔而不是逗号分隔.

题:

如何列出逗号分隔的目录?

如何将此列表作为-d参数添加到phpdoc脚本中?

Aro*_*eel 37

使用ls -dm */生成一个逗号分隔的目录列表.-d将仅返回目录,-m并将输出到以逗号分隔的列表.

然后,您可以将输出存储在变量中并将其作为参数传递:

#!/bin/bash
MY_DIRECTORY=/some/directory
FOLDERS=`ls -dm $MY_DIRECTORY/*/ | tr -d ' '`
phpdoc -d $FOLDERS
Run Code Online (Sandbox Code Playgroud)

  • 实际上我不得不添加`| tr -d'\n'现在它完美无缺. (15认同)
  • `ls -m | sed -e's /,/,/ g'` (5认同)
  • `-d`不会_ls限制输出到目录;它只是防止`ls`下降到目录中。 (2认同)

cda*_*rke 5

无需调用外部程序(假设bash或ksh93):

var=(../*test*)
IFS=','
phpdoc -d "${var[*]}"
Run Code Online (Sandbox Code Playgroud)

请参阅下面的@ mklement0的评论.这个解决方案的问题是它会找到文件名和目录,因此:

var=(../*test*/)            # trailing / ensures directories only
IFS=','
phpdoc -d "${var[*]/%/}"    # remove the trailing / from the names
Run Code Online (Sandbox Code Playgroud)

涉及所有数组元素扩展的解决方案是@ mklement0(除了不需要转义/).

  • 我很高兴 - 这是一个强大的功能,但不常见,因此很容易忘记(就像我一样,直到我们的交换记录了我的记忆).很高兴知道在这种情况下,转义`/`是可选的,但是值得指出的是_is_itutions的非空_substitutions_需要它(而不仅仅是_removal_); 例如,'var = '12 /'; echo"$ {var /%\ //!}"`产生`12!`,如预期的那样,但`var = '12 /'; echo"$ {var /%//!}"`产生`12 //!` (2认同)

ken*_*orb 5

这是使用findand 的更简单方法paste

dirs=$(find . -type d | paste -d, -s)
Run Code Online (Sandbox Code Playgroud)

同样,但使用绝对路径:

dirs=$(find "$PWD" -type d | paste -d, -s)
Run Code Online (Sandbox Code Playgroud)

和版本tr

dirs=$(find . -type d -print0 | tr '\0' ',')
Run Code Online (Sandbox Code Playgroud)

以上将递归扫描文件夹,除非您将添加-maxdepth 1到仅一层深的列表。

然后运行phpdoc为:

./phpdoc -d "$dirs"
Run Code Online (Sandbox Code Playgroud)