遍历 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 $tempfile
做 touch "$tempfile"
.
我是 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 $tempfile
做 touch "$tempfile"
.