正确转义bash脚本中的正斜杠以用于sed


14

我正在尝试通过在干燥模式下运行rsync并总结rsync输出中列出的文件的大小来确定在同步两个文件夹时将新复制的文件的大小。

目前,我一直坚持以文件的父文件夹作为前缀。我发现了如何使用sed为行添加前缀以及如何使用sed进行转义,但是我很难将两者结合起来。

这是我走了多远:

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

任何有关如何正确逃脱的想法将不胜感激。

Answers:


28

实际上,您不必为转义而烦恼/。从GNU sed手册

这些/字符可以在任何给定s命令中被任何其他单个字符统一替换。

例如:

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

给出输出

barbar

4
这应该是sed手册页中的第一件事
Clearer

像“任何” *一样吗?
Ujjwal Singh 2015年

0

如果您试图汇总数据,则可能要跳过任何可能的子目录。这可能不适用,但始终最好避免任何怪异。这是我的源目录。这些文件都是通过触摸创建的,因此它们占用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块将执行以下操作:
1d; 删除“发送增量文件列表”的第一行
/ ^ $ /,$ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.