我有以下目录名称:
/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
补充笔记:
- 当然,写成一行也是可以的:
for dir in */; do composer show drupal/"$dir" --available | ack versions; done
- 您可以调整该命令以迭代目录名称的显式列表,如
如果您的实际目录名称包含特殊字符,则各个列表项周围的引号是必要的(但请注意,在某些情况下仅使用引号是不够的,因此上面显示的基于 glob 的方法仍然是最安全的)。for dir in '/aaa' '/bbb' '/ccc' do ... done
答案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
对于N
ullglob,这样如果 glob 与任何文件都不匹配,您就不会收到错误,/
以选择文件类型目录仅有的。如果您还希望包含隐藏目录,请添加D
(对于D
otglob)限定符。
替换/
为-/
还包括目录的符号链接(就像*/
(也适用于其他 shell)一样,除了扩展*/
还在/
每个文件的末尾添加 )。
这里我们ack
只对所有命令的输出运行一次composer
,因为我们不需要为每个命令运行一个。这也意味着该管道的整体退出状态将反映是否version
在其中任何一个管道中至少找到过一次。如果您移动| ack version
到循环内部,总体退出状态将反映是否version
已在最后处理的目录中找到,这是没有用的。