Bash以递归方式在每个目录上执行命令

时间:2014-03-25 12:50:16

标签: linux bash console

我有一个里面有很多子目录的目录,我想在每个子目录上执行一个命令。

我想要做的就是运行' svn up'

这是我到目前为止所尝试的

find . -type d -maxdepth 1 -exec svn "up '{}'" \;

for dir in * do cd $dir; svn up; cd ..;

到目前为止,他们都没有工作(我已经尝试了许多没有运气的事情)

3 个答案:

答案 0 :(得分:5)

你只需要在glob上使用尾部斜杠:

for d in */; do # only match directories
  ( cd "$d" && svn up ) # Use a subshell to avoid having to cd back to the root each time.
done

答案 1 :(得分:2)

这似乎有效:

find . -type d -maxdepth 1 -exec svn up "{}" \;

但它试图更新当前目录,应该省略。 (虽然它对我有用,因为当前目录不是svn目录)

答案 2 :(得分:2)

这对我有用 - -d检查目录:

for f in *; do if [ -d "$f" ]; then cd "$f"; echo "$f"; cd ..; fi; done

echo "$f"可以代替您希望在每个目录中运行的任何命令。

请注意,这和trailing / solution都匹配符号链接以及文件。如果要避免此行为(仅输入实际目录),可以执行以下操作:

for f in *; do if [ -d "$f" -a ! -L "$f" ]; then cd "$f"; echo "$f"; cd ..; fi done