[英]How to read config files with section in bash shell
我在部分中有这样的配置文件
[rsync_includes]
user
data
conf
[rsync_exclude]
tmp
.pyc
*/vendor
[javascript]
utils
data
我有要在该文件中的rsync和其他配置数据中排除的模式
现在我很困惑如何在命令行上使用这些模式
rsync -avz --exclude-from 'content from config file rsync exclude' source/ destination/
我不确定如何读取部分配置文件然后在命令行上使用
要使用--exclude-from
您必须将配置的相关部分隔离到一个临时文件中。 使用sed可以轻松做到这一点:
tmp_file=$(mktemp)
sed -n '1,/rsync_exclude/d;/\[/,$d;/^$/d;p' config.file > $tmp_file
rsync -avz --exclude-from $tmp_file source/ destination/
我为了清楚起见省略了错误检查和清理。
请注意,rsync可以从stdin中为-
输入读取排除模式,因此它更短:
sed -n '1,/rsync_exclude/d;/\[/,$d;/^$/d;p' config.file | \
rsync -avz --exclude-from - source/ destination/
说明
1,/rsync_exclude/d
排除直到rsync_exclude节条目的所有行 /\\[/,$d
排除从下一节开始到文件末尾的所有内容 /^$/d
排除空行(这是可选的) 以上所有内容均从配置中提取相关部分。
如果您的配置文件位于config.ini
,请运行bash脚本:
rm rsync-filter
while IFS= read -r line
do
case "$line" in
\[rsync_includes\]) command=include ;;
\[rsync_exclude\]) command=exclude ;;
\[*) command= ;;
*) [ "$command" -a "$line" ] && echo "$command $line" >>rsync-filter
esac
done <config.ini
运行之后,它将创建rsync-filter,其中包含包含和排除规则,并且可以与rsync一起使用,如下所示:
rsync -avz --filter='merge rsync-filter' source/ destination/
另外, rsync
提供-F
选项,它等效于--filter='dir-merge /.rsync-filter'
。 此加载从文件/source/.rsync-filter
包含/排除规则,此外,随着rsync
深入目录树,它将从.rsync-filter
文件中查找并加载规则, .rsync-filter
这些规则应用于该目录及其子目录中的文件。 这是保留和组织rsync规则的有效方法。
同样,rsync读取包含和排除规则的顺序也很重要。 使用这些过滤器文件,您可以控制该顺序。 当您尝试使rsync规则正常工作时,这是一个重要的优势。
我承认,我对rsync不熟悉,但我自己会对数据进行格式化。
# rsync-data-file+.txt
rsync-includes:user
rsync-includes:data
rsync-includes:conf
rsync-exclude:tmp
rsync-exclude:.pyc
rsync-exclude:\*\/vendor
javascript:utils
javascript:data
从那里,您可以执行以下操作:
#!/usr/bin/env bash
set -x
while read line
do
if [ $(echo "${line}" | sed -n '/rsync-includes/'p) ]
then
parameter=$(echo "${line}" | cut -d':' -f2)
rsync "${parameter}" (other switches here etc)
fi
done < rsync-data-file+.txt
这样,您可以根据参数所属的组来自定义命令行。 所以从JavaScript的组参数,您可以登录操作到不同的文件,例如。
#!/bin/sh
typeset -A Nconfig # init array
typeset -A Oconfig # init array , u can declare multiple array for each section.s
while read line
do
if [ "$line" = "[SECTION1]" ]
then
SECTION1=1
SECTION2=0
continue
fi
if [ "$line" = "[SECTION2]" ]
then
SECTION1=0
SECTION2=1
continue
fi
if [ "$line" = "[SECTION3]" ]
then
SECTION1=0
SECTION2=0
continue
fi
if [ $SECTION1= 1 ]
then
if echo $line | grep -F = &>/dev/null
then
varname=$(echo "$line" | cut -d '=' -f 1)
echo "Novar $varname"
Nconfig[$varname]=$(echo "$line" | cut -d '=' -f 2)
fi
fi
if [ $SECTION2 = 1 ]
then
if echo $line | grep -F = &>/dev/null
then
varname=$(echo "$line" | cut -d '=' -f 1)
Oconfig[$varname]=$(echo "$line" | cut -d '=' -f 2)
fi
fi
done < Config
echo "SECTION1 FROM=${Nconfig[FROM]}"
echo "SECTION2FROM=${Oconfig[FROM]}"
[SECTION1]
FROM=abc@pqr.com
TO=abc@pqr.com
SIZE=80
THRESHOULD=60
[SECTION2]
FROM=xxxx@pqr.com
TO=xxxx@pqr.com,yyyy@pqr.com
SIZE=60
THRESHOULD=30
[SECTION3]
FROM=AAAA@pqr.com
TO=BBBB@pqr.com,yyyy@pqr.com
SIZE=60
THRESHOULD=30
LOCATION=/mnt/device/user1/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.