将目录名称单独传递到 bash 命令中

将目录名称单独传递到 bash 命令中

我有以下目录名称:

/aaa
/bbb
/ccc
/ddd

我想运行以下命令传递目录名称LS:

ls | composer show drupal/MY_DIRECTORY_NAME_HERE --available | ack versions

如何创建一行命令以循环将目录名称传递到此 Composer 命令中?

答案1

由于您显然希望将该命令应用于所有现有子目录,因此最简洁的方法(避免目录名称带有特殊字符的问题)将是

for dir in */
do
   composer show drupal/"$dir" --available | ack versions
done

这将迭代所有非隐藏目录和目录的符号链接(由于/glob 模式的尾随)并在当前目录上执行命令。

请注意,这假设该命令接受带有尾随的目录路径/。如果没有,进行一些 shell 字符串处理来剥离/会有所帮助:

for dir in */
do
   composer show drupal/"${dir%/}" --available | ack versions
done

补充笔记:

  1. 当然,写成一行也是可以的:
    for dir in */; do composer show drupal/"$dir" --available | ack versions; done
    
  2. 您可以调整该命令以迭代目录名称的显式列表,如
    for dir in '/aaa' '/bbb' '/ccc'
    do
        ...
    done
    
    如果您的实际目录名称包含特殊字符,则各个列表项周围的引号是必要的(但请注意,在某些情况下仅使用引号是不够的,因此上面显示的基于 glob 的方法仍然是最安全的)。

答案2

我会做什么:

printf '%s\n' '/aaa' '/bbb' '/ccc' |
    xargs -I{} composer show drupal/{} --available |
    ack versions

或对于当前目录中的任何目录:

find . -type d -mindepth 1 -maxdepth 1 -print0 |
    xargs -0 -I{} composer show drupal/{} --available |
    ack versions

答案3

zsh

for dir in *(N/); do composer show drupal/$dir --available; done | ack version

(N/)部分是全局限定符N对于Nullglob,这样如果 glob 与任何文件都不匹配,您就不会收到错误,/以选择文件类型目录仅有的。如果您还希望包含隐藏目录,请添加D(对于Dotglob)限定符。

替换/-/还包括目录的符号链接(就像*/(也适用于其他 shell)一样,除了扩展*/还在/每个文件的末尾添加 )。

这里我们ack只对所有命令的输出运行一次composer,因为我们不需要为每个命令运行一个。这也意味着该管道的整体退出状态将反映是否version在其中任何一个管道中至少找到过一次。如果您移动| ack version到循环内部,总体退出状态将反映是否version已在最后处理的目录中找到,这是没有用的。

相关内容