如何进入当前路径中的每个目录并执行脚本

UAd*_*ter 6 bash ls cd-command

我想进入由ls命令重新调整的每个目录并执行脚本。

我试过这个(和许多其他的东西),但它就是行不通

ls  | awk '{print $1" && pwd"}' | xargs cd
Run Code Online (Sandbox Code Playgroud)

没有for循环怎么办?

Oli*_*Oli 18

find . -type d -exec bash -c 'cd "$0" && pwd' {} \;
Run Code Online (Sandbox Code Playgroud)

交换pwd你的脚本。而.根目录名,如果不是“当前”目录。

bash -c "..."由于工作方式,您必须包装 exec 子句-execcd不存在于其有限的环境中,但正如您通过运行上述命令所看到的,当您引入 bash 来完成这项工作时,一切都按预期运行。

编辑:我不确定为什么 2011 Oli 没有想到,-execdir但这可能是一个更快的解决方案:

find . -type d -execdir pwd \;
Run Code Online (Sandbox Code Playgroud)

  • 干得好奥利。如前所述,我在这里添加了 `maxdepth`,也是因为它似乎暗示了当前的子目录,所以我删除了 `.`: `find 。-maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && pwd" \;` (4认同)

enz*_*tib 9

如果可以,请find按照其他答案中的建议使用,xargs几乎总是要避免的。

但是,如果您仍想使用xargs,则可能的替代方法如下:

printf '%s\0' */ | xargs -0 -L1 bash -c 'cd -- "$1" && pwd' _
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  1. */ 由于尾部斜杠,扩展到当前文件夹中的目录列表

  2. printfwith \0(null byte) 为每一行分隔一个元素

  3. 选择-L1xargs使得它一旦对每个输入行都执行和选项-0使得输入的空字节分开:文件名可以包含任何字符,该命令不破!

  4. bash删除双引号并将其作为单个参数传递给内联脚本,但cd应再次放置双引号以将其解释为单个字符串;using--使cd命令对以连字符开头的文件名具有鲁棒性

  5. 为了避免作为参数的奇怪使用$0,通常放置第一个虚拟参数_