这是我目前所拥有的:
for f in 'svn ls repository_dir';
do
svn checkout repository_dir/$f/trunk/dir1/dir2/dir3/dir4/needed_dir
done
这对于将needed_dir 放在正确位置的项目(数百个)非常有用。但有些项目 ($f) 的目录结构略有不同。因此“needed_dir”可能位于不同的位置。
在 do 循环中,我怎样才能告诉我的 bash 脚本:
“查找“needed_dir”。如果找到,请检查它。”
或者
“查找“needed_file.txt”。如果找到,请检查它。”
感谢您的任何帮助
答案1
这可能是最简单的寻找。
要执行或目录树中svn checkout
命名的每个目录,请使用以下命令:needed_dir
repository_dir/$f/trunk
find repository_dir/$f/trunk/ -type d -name needed_dir -exec svn checkout {} \;
{}
用找到的目录的名称来查找替代品。
开关-type d
仅查找目录,而-type f
仅查找文件。
答案2
抱歉,我没有足够的声誉来发表评论,所以我必须创建一个新的答案。
该find
命令在这里不起作用,因为它只能搜索磁盘上的目录。(因此,只有当您首先 svn checkout 整个“repository_dir”时,它才会起作用。)
看StackOverflow 上的以下链接对于类似的问题。那里给出的答案与此类似,但更合适:
for f in 'svn ls -R repository_dir | grep "needed_dir"';
do
svn checkout repository_dir/$f
done
svn 的 -R 选项使 svn 递归列出 URL 处的所有内容。Grep 搜索您需要的目录。
不管怎样,您可以使用命令xargs
而不是 for 循环,使其更简洁一些。
svn list -R <URL> | grep "needed_dir" | xargs --max-args=1 -I'{}' svn co <URL>'{}'
Xargs 对 svn list 和 grep 发现的每个空格分隔的单词运行“svn co (path-in-url)”。(奇怪的 -I'{}' 是必需的,否则 xargs 会在 URL 和子目录名称之间放置一个空格。)