cd到shell脚本中的多个目录

时间:2017-06-30 16:38:51

标签: shell

我正在创建一个名为domainname.com/search/query的脚本来访问名为Big_script.shA的两个目录,在其中我需要访问名为B的三个目录,{{1} },A1; A2A3B1(分别)。进入后,我需要脚本运行另一个带有B2的脚本。

是否可以在B3中执行以下操作:

sh small_script.sh

或者有没有办法在shell脚本或python中做到这一点可以帮助?因为它不起作用

1 个答案:

答案 0 :(得分:1)

一次不能cd到多个目录(如果cd的路径是相对的,则需要返回原始目录)。它不是shell的限制,而是unix processes的属性(因此在Python或C等其他语言中编码不会发生太大变化);他们每个人都有 一个当前目录(并且shell为其cd内置运行chdir(2)系统调用

您可以考虑计算每个目录的完整路径(使用realpath(1)),并将该路径存储在某个shell变量中。然后你可以循环cd

有些shell有一个堆栈目录,您可以使用pushd& popd。在这种情况下,您可以编码

for d in */* ; do
  pushd "$d"
  sh small_script
  popd
done

您需要确保*/*的{​​{3}}扩展仅提供目录。使用zsh,您可以编码*/*(/)以仅展开目录。见globbing& glob(7)& path_resolution(7)

如果您的shell没有pushd,您可以尝试

for d in $(realpath */*); do
  cd "$d" && sh small_script.sh
done

或使用子shell

for d in */*; do
  (cd "$d" && exec small_script.sh)
done

有关pushd&的更多信息,请参阅credentials(7) popd

请注意,如果稍后cd a/b执行cd e/f,则shell会尝试(对于第二个cd)进入a/b/e/f目录(可能不会因为e/f是一个相对路径(因此在前一个当前目录a/b的上下文中解释)。您可能需要cd a/b后跟cd ../../e/f ...

花时间了解为什么cd需要成为shell内置的。也许阅读this

另见Advanced Linux Programming。它可能更有用(使用-exec操作)。

顺便说一下,将small_script更改为接受它应该去的目录的参数可能更简单。然后该脚本可能以cd "$1"开头。