1

ファイル内の除外のリストを使用して変数を作成しようとすると、いくつかの支援が必要です。

したがって、rsyncに使用している除外ファイルは次のようになります。

*.log
*.out
*.csv
logs
shared
tracing
jdk*
8.6_Code
rpsupport
dbarchive
inarchive
comms
PR116PICL
**/lost+found*/
dlxwhsr*
regression
tmp
working
investigation
Investigation
dcsserver_weblogic_
dcswebrdtEAR_weblogic_

egrep -vにフィードする変数として使用する文字列を作成する必要があります。これにより、find-lsからegrep-vを実行する場合と同じ除外リストをrsyncに使用できます。

したがって、これまでにこれを作成して、すべての「*」と「/」を削除しました。特定の特殊文字が表示されると、それらをエスケープします。

cat exclude-list.supt | while read line
    do
    echo $line | sed 's/\*//g' | sed 's/\///g' | 's/\([.-+_]\)/\\\1/g'

出力が必要なのは次のようになり、それを変数としてエクスポートします。

SEXCLUDE_supt="\.log|\.out|\.csv|logs|shared|PR116PICL|tracing|lost\+found|jdk|8\.6\_Code|rpsupport|dbarchive|inarchive|comms|dlxwhsr|regression|tmp|working|investigation|Investigation|dcsserver\_weblogic\_|dcswebrdtEAR\_weblogic\_"

誰か助けてもらえますか?

4

3 に答える 3

4

次のいくつかの問題:

cat exclude-list.supt | while read line
    do
    echo $line | sed 's/\*//g' | sed 's/\///g' | 's/\([.-+_]\)/\\\1/g'

Sedファイルを1行ずつ読み取るためcat | while read line;do echo $line | sed、完全に冗長sedです。コンマ区切りのリストとしてファイルを渡すか、-eオプションを使用して複数の置換を行うこともできるため、3回にパイプするsedのは2回多すぎます。'[.- + _]'の問題は、-.にあるため、文字クラス内で使用する場合+は範囲​​として解釈され、最初または最後に配置すると、のようにこの意味が失われます。.-+-[._+-]

はるかに良い方法:

$ sed -e 's/[*/]//g' -e 's/\([._+-]\)/\\\1/g' file
\.log
\.out
\.csv
logs
shared
tracing
jdk
8\.6\_Code
rpsupport
dbarchive
inarchive
comms
PR116PICL
lost\+found
dlxwhsr
regression
tmp
working
investigation
Investigation
dcsserver\_weblogic\_
dcswebrdtEAR\_weblogic\_

これで、改行をパイプスルーtr '\n' '|'して、次の準備ができた代替のパイプに置き換えることができegrepます。

$ sed -e 's/[*/]//g' -e 's/\([._+-]\)/\\\1/g' file | tr "\n" "|"
\.log|\.out|\.csv|logs|shared|tracing|jdk|8\.6\_Code|rpsupport|dbarchive|...

$ EXCLUDE=$(sed -e 's/[*/]//g' -e 's/\([._+-]\)/\\\1/g' file | tr "\n" "|")

$ echo $EXCLUDE
\.log|\.out|\.csv|logs|shared|tracing|jdk|8\.6\_Code|rpsupport|dbarchive|...

注:ファイルが改行文字で終わっている場合は、最後の末尾を削除する必要があります。|を試してくださいsed 's/\(.*\)|/\1/'

于 2013-01-29T10:01:56.717 に答える
2

これはあなたのために働くかもしれません(GNU sed):

SEXCLUDE_supt=$(sed '1h;1!H;$!d;g;s/[*\/]//g;s/\([.-+_]\)/\\\1/g;s/\n/|/g' file)
于 2013-01-29T10:30:50.160 に答える
0

これはうまくいくはずですが、もっと良い解決策があると思います。まず、すべてをbash配列に格納します。

SEXCLUDE_supt=$( sed -e 's/\*//g' -e 's/\///g' -e 's/\([.-+_]\)/\\\1/g' exclude-list.supt)

次に、それを再度処理して空白を置き換えます。

SEXCLUDE_supt=$(echo $SEXCLUDE_supt |sed 's/\s/|/g')
于 2013-01-29T10:09:40.150 に答える