Thoát đúng dấu gạch chéo về phía trước trong tập lệnh bash để sử dụng với sed


14

Tôi đang cố gắng xác định kích thước của các tệp sẽ được sao chép mới khi đồng bộ hóa hai thư mục bằng cách chạy rsync ở chế độ khô và sau đó tổng hợp kích thước của các tệp được liệt kê trong đầu ra của rsync.

Hiện tại tôi đang bị kẹt ở tiền tố các tập tin bởi thư mục mẹ của chúng. Tôi đã tìm ra cách để tiền tố các dòng sử dụng sed và cách thoát bằng sed, nhưng tôi gặp khó khăn khi kết hợp cả hai.

Đây là cách tôi đã nhận được:

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}'

Đây là đầu ra tôi nhận được từ 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

Bất kỳ ý tưởng về cách thoát đúng sẽ được đánh giá cao.

Câu trả lời:


28

Bạn thực sự không cần phải bận tâm đến việc thoát khỏi /. Từ hướng dẫn GNUsed :

Các /ký tự có thể được thay thế đồng nhất bởi bất kỳ ký tự đơn nào khác trong bất kỳ slệnh nào.

Ví dụ:

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

cho đầu ra

barbar

4
Đây phải là điều đầu tiên trong trang man cho sed
Clearer

Bất kỳ như trong 'bất kỳ' *?
Ujjwal Singh

0

Nếu bạn đang cố gắng kiểm đếm dữ liệu, bạn có thể muốn bỏ qua mọi thư mục con có thể. Điều này có thể không được áp dụng, nhưng tốt nhất là luôn tránh mọi điều kỳ lạ. Đây là thư mục nguồn của tôi. Các tệp này đều được tạo bằng cảm ứng, vì vậy chúng chiếm 0 dung lượng.

$ 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

Bạn không cần phải trốn thoát bất cứ nơi nào gần như bạn đang làm. Khối sed ở đây sẽ làm như sau:
1d; xóa dòng đầu tiên của 'gửi danh sách tệp gia tăng'
/ ^ $ /, $ d; xóa dòng trống biểu thị cuối danh sách tập tin và mọi thứ sau nó.
// $ / d xóa bất kỳ dòng nào kết thúc bằng '/', đó sẽ là các thư mục
Lưu ý rằng bạn có thể thoát dấu gạch chéo bằng dấu gạch chéo ngược (để trả lời câu hỏi thực tế).

$ 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

Và để có thêm điểm thưởng, bạn thậm chí có thể kiểm tra kết quả:

$ 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

Nếu bạn đang làm điều này với thư mục đã được đồng bộ hóa hoàn toàn, nó sẽ trả về kết quả hài hước:

76  .
sum: 76
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.