Sed ile kullanım için bash betiğinde düzgün eğik çizgi


14

Kuru modda rsync çalıştırarak ve daha sonra rsync çıkışında listelenen dosyaların boyutlarını toplayarak iki klasör eşitlerken yeni kopyalanacak dosyaların boyutunu belirlemeye çalışıyorum.

Şu anda dosyaların üst klasörlerine önek eklemede kalıyorum. Sed kullanarak satırlara nasıl önek ekleyeceğimi ve sed kullanarak nasıl kaçacağımı öğrendim, ama bu ikisini birleştiren sıkıntılar yaşıyorum.

Bu kadar uzaklara:

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

Bu bash -x myscript.sh'den aldığım çıktı

+ 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

Düzgün nasıl kaçacağına dair herhangi bir fikir çok takdir edilecektir.

Yanıtlar:


28

Aslında kaçmakla uğraşmanıza gerek yok /. Gönderen GNU sedkılavuzda :

/Karakterler düzgün herhangi bir içinde başka tek karakteri ile değiştirilebilir skomuta.

Örneğin:

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

çıktı verir

barbar

4
Bu sed için adam sayfasında ilk şey olmalı
Clearer

Herhangi biri 'herhangi' * gibi?
Ujjwal Singh

0

Verileri kaydetmeye çalışıyorsanız, olası alt dizinleri atlamak isteyeceksinizdir. Bu geçerli olmayabilir, ancak herhangi bir tuhaflıktan kaçınmak her zaman en iyisidir. İşte benim kaynak dizinim. Bu dosyaların hepsi dokunarak oluşturuldu, bu yüzden 0 yer kaplıyorlar.

$ 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

Yaptığın kadar yakın bir yerden kaçmana gerek yok. Buradaki sed bloğu şunları yapacaktır:
1d; 'artan dosya listesi gönderme'
/ ^ $ /, $ d' nin ilk satırını sil ; dosya listesinin sonunu ve sonrasındaki her şeyi gösteren boş satırı silin.
// $ / d '/' ile biten herhangi bir satırı siler, ki bu da dizinler olacaktır
.

$ 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

Ekstra bonus puanları için, sonuçları bile hesaplayabilirsiniz:

$ 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

Bunu zaten tamamen senkronize edilmiş bir dizinle yapıyorsanız, komik sonuçlar döndürür:

76  .
sum: 76
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.