sedで使用するためにbashスクリプトでスラッシュを適切にエスケープする


14

2つのフォルダーを同期するときに、rsyncをドライモードで実行し、rsyncの出力にリストされているファイルのサイズを合計して、新しくコピーされるファイルのサイズを決定しようとしています。

現在、親フォルダをファイルのプレフィックスに付けています。sedを使用して行にプレフィックスを付ける方法とsedを使用してエスケープする方法を見つけましたが、これら2つを組み合わせるのに問題があります。

これは私がどこまで到達したかです:

source="/my/source/folder/"
target="/my/target/folder/"
escaped=`echo "$source" | sed -e 's/[\/&]/\\//g'`
du `rsync -ahnv $source $target | tail -n +2 | head -n -3 | sed "s/^/$escaped/"` | awk '{i+=$1} END {print i}'

これは、bash -x myscript.shから取得した出力です

+ source=/my/source/folder/
+ target=/my/target/folder
++ echo /my/source/folder/
++ sed -e 's/[\/&]/\//g'
+ escaped=/my/source/folder/
+ awk '{i+=$1} END {print i}'
++ rsync -ahnv /my/source/folder/ /my/target/folder/
++ sed 's/^//my/source/folder//'
++ head -n -3
++ tail -n +2
sed: -e expression #1, char 8: unknown option to `s'
+ du
80268

適切に脱出する方法についてのアイデアは大歓迎です。

回答:


28

あなたは実際にエスケープすることを気にする必要はありません/GNU sedマニュアルから:

/文字は一様に、任意の内の任意の他の単一の文字に置き換えることができるsコマンド。

例えば:

echo 'foobar' | sed -e 's#foo#bar#'

出力を与える

barbar

4
これは、sedのmanページで最初にすべきです
Clearer

「any」のように*?
ウジヴァルシン

0

データを集計しようとしている場合、可能性のあるサブディレクトリをスキップする可能性があります。これは当てはまらないかもしれませんが、奇妙さを避けることが常に最善です。これが私のソースディレクトリです。これらのファイルはすべてタッチで作成されたため、スペースを取りません。

$ find source
source
source/5832
source/5832/5832_1.png
source/5832/5832_2.png
source/5831
source/5831/5831_1.png
source/5830
source/5830/5830_3.png
source/5830/5830_1.png
source/5830/5830_2.png

あなたがしているのと同じくらい近くのどこかに逃げる必要はないはずです。ここのsedブロックは次のことを行い
ます。「増分ファイルリストの送信」の最初の行を削除します
/ ^ $ /、$ d; ファイルリストの終わりとそれ以降のすべてを示す空白行を削除します。
// $ / dは '/'で終わる行を削除します。これはディレクトリになります
ます(実際の質問に答えるために)スラッシュをバックスラッシュでエスケープできることに注意してください。

$ du $(rsync -ahnv source target | sed '1d;/^$/,$d;/\/$/d')
0   source/5830/5830_1.png
0   source/5830/5830_2.png
0   source/5830/5830_3.png
0   source/5831/5831_1.png
0   source/5832/5832_1.png
0   source/5832/5832_2.png

また、追加のボーナスポイントについては、結果を集計することもできます。

$ du -s $(rsync -ahnv source target | sed '1d;/^$/,$d;/\/$/d') | awk '{x+=$1;print $0} END {print "sum: "x}'
0   source/5830/5830_1.png
0   source/5830/5830_2.png
0   source/5830/5830_3.png
0   source/5831/5831_1.png
0   source/5832/5832_1.png
0   source/5832/5832_2.png
sum: 0

すでに完全に同期されたディレクトリでこれを実行している場合、面白い結果が返されますが、

76  .
sum: 76
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.