Bir seferde birden fazla dosya / klasör için pv ile dosya başına ilerleme?


0

Burada başka bir yayında bulduğum bu bir satır komutunu kullanıyorum ve bir seferde bir klasör için harika çalışıyor. Bu komut:

tar -cf - /opt/folder1 | pv -s $(du -sb /opt/folder1 | awk '{print $1}') | gzip > archive.tar.gz

Bu, aynı anda birden fazla dosya / klasör için çalışmak ve her klasör / dosya için aynı komutu çalıştırmak yerine, genel ilerleme elde etmek için nasıl değiştirilebilir. İşte kullanım örneği:

/ Opt / folder1, / opt / folder2 ve /opt/folder3/*.db dosyalarım var. Bunların hepsi bunun gibi bir değişkende birleştirilebilir.

filestobackup=(
        /opt/folder1
        /opt/folder2 
        /opt/folder3/*.db
    )

Bu çalışmıyor:

tar -cf - "${filestobackup[@]}" | pv -s $(du -sb "${filestobackup[@]}" | awk '{print $1}') | gzip > archive.tar.gz

Yanıtlar:


0

Hızlı cevap : çizgiyi

tar -cf - "${filestobackup[@]}" | pv -s $(du -cb "${filestobackup[@]}" | tail -1 | awk '{print $1}') | gzip > archive.tar.gz

Uzun cevap : Sorun şu ki du, tek dizinde olduğu gibi değil, birkaç çıktı satırı üretecek. Anahtar -s, her giriş duiçin toplam boyutu yazdırır . Birkaç girişi geçtiğinden (klasör1 ve klasör2 için iki, artı klasör 3'teki her dosya için bir tane ), şöyle bir şey yazdıracaktır:du.dbdu

2112345 opt/folder1
57148   opt/folder2
388     opt/folder3/foo.db
161     opt/folder3/bar.db

Anahtarını kullanarak -c, dugenel toplamı içeren son bir çizgi yazdırır. Bu değeri kullanmak için, duçıktıyı yalnızca son satırı almak için filtrelemeniz gerekir .

Bu, daha önce boruda kullandığınız awk ile veya daha basit bir şekilde (küçük) bir performans cezasına rağmen, bir tail -1filtre ekleyerek yapılabilir .

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.