遍历 bash 中的文件并过滤目录名开头

Looping though a file in bash and filtering for a directory name beginning

我是 bash 脚本编写的新手,我正在尝试编写一个 bash 脚本以与颠覆挂钩一起使用。

目标是获取已提交的 java 项目的列表,然后将该列表写入文件(这样我就可以从中创建更改日志并将其显示在应用程序中)以及一些我已经计算出的使用 svnlook 收集的其他信息。

因为 subversion 本身并不真正关心我在 eclipse 中提交的项目而是使用目录,所以我必须使用 "svnlook changed" 命令来吐出每个文件及其完整路径包含在提交中。

这里有一个例子 "svnlook changed" returns:

U   Project/branches/11.4.11.001/LIB1/com/some/other/directory/some_java_class.java 
U   Project/branches/11.4.11.001/LIB2/com/some/other/directory/another_thingy.java                                                                                                                                                                                                                                                                                                                                                                     
U   Project/branches/11.4.11.001/new/directories/LIB1/com/something/some_java_class.java                                                                                                                                                                                                                                                                                                                                                            
U   Project/branches/11.4.11.001/PRJ1/com/directory/some_java_class.java

现在我不能保证这个目录结构永远是一样的,所以我想做的是通过过滤 "PRJ" 和 [=53] 来找到 java 项目名称=],因为它们总是以这些字母开头,我可以肯定这不会改变。

所以我想在脚本中做的是:

第 1 步:将 "svnlook changed" 的输出放入文件中:

tempfile=/data/svn/scratch.txt
input=/data/svn/scratch2.txt
touch $tempfile
touch $input

$SVNLOOK changed -r "$REVISION" "$REPOS" >> $input 

这有效。

第2步:遍历文件的每一行,通过在路径中查找"LIB"或"PRJ"来获取表示项目的子字符串。将这些写入文件。现在我只是假设子目录不超过 9 个,我在路径上循环 10 次以查看每个子目录:

for i in {1..10}
do
        cat $input | cut -d "/" -f $i | grep -i -s -e PRJ -e LIB | tr [:lower:]äöü [:upper:]ÄÖÜ >> $tempfile
done

这在脚本中不起作用。 /data/svn/scratch.txt 中的文件始终为空。当我 运行 来自命令行的命令并替换 $input 和 $i 时,它起作用并且以下所有命令也起作用。

第 3 步:设置所有其他变量。我遍历临时文件,过滤掉重复项并用逗号分隔它们:

DATE=$(date '+%d-%m-%Y')
REVISION=$($SVNLOOK youngest "$REPOS") 
CHANGEDPRJ=$(cat $tempfile | sort -u |  xargs | sed -e 's/ /, /g')
COMMENT=$($SVNLOOK log -t "$TXN" "$REPOS")

将此变量与其他内容一起 4:Output 步进到我要将其全部存储在其中的文件中:

echo "$DATE" , "$REVISION" , "$CHANGEDPRJ" , "$COMMENT" >> /data/svn/commit.log

所以现在我得到:

17-02-2020 , 571 , , 过期评论清理

而不是:

17-02-2020 , 571 , LIB1,LIB2,PRJ1 , 过期评论清理

我很确定有一个非常明显和简单的解决方案可以使它正常工作,但我 bash 今天是第一次编写脚本,我似乎无法 google 为了正确的事情找出我做错了什么....如果有人能指出我正确的方向,那就太棒了!

以下:

cat <<EOF |
U   Project/branches/11.4.11.001/LIB1/com/some/other/directory/some_java_class.java 
U   Project/branches/11.4.11.001/LIB2/com/some/other/directory/another_thingy.java
U   Project/branches/11.4.11.001/new/directories/LIB1/com/something/some_java_class.java     
U   Project/branches/11.4.11.001/PRJ1/com/directory/some_java_class.java
EOF
# remove the U<space><space>
sed 's/^U  //' |
# replace `/` with a newline
tr '/' '\n' |
# grep only lines with PRJ and LIB
grep -e 'PRJ\|LIB' |
# sort unique
sort -u |
# join elements with a comma
paste -sd,

输出:

LIB1,LIB2,PRJ1

所以你想要:

"$SVNLOOK" changed -r "$REVISION" "$REPOS" |
sed 's/^U  //' | tr '/' '\n' | grep -e 'PRJ\|LIB' | sort -u | paste -sd,

注意:记得引用变量扩展。不要 touch $tempfiletouch "$tempfile".