Dosya başına katran ilerlemesini görmenin bir yolu var mı?


122

Sıkıştırmak istediğim birkaç büyük dosyam var. Mesela bunu yapabilirim

tar cvfj big-files.tar.bz2 folder-with-big-files

Sorun şu ki, hiçbir ilerleme göremiyorum, bu yüzden ne kadar süreceği veya buna benzer bir şey hakkında hiçbir fikrim yok. Kullanarak ven azından her dosyanın ne zaman tamamlandığını görebiliyorum, ancak dosyalar az ve çok büyük olduğunda bu en yararlı değil.

Daha ayrıntılı ilerleme göstermek için katranı alabilmemin bir yolu var mı? Yapılan bir yüzde veya ilerleme çubuğu veya kalan süre gibi bir şey gibi. Her bir dosya için veya hepsi veya ikisi için.

Yanıtlar:


100

Oneliner'ı böyle tercih ederim:

tar cf - /folder-with-big-files -P | pv -s $(du -sb /folder-with-big-files | awk '{print $1}') | gzip > big-files.tar.gz

Bunun gibi bir çıktısı olacak:

4.69GB 0:04:50 [16.3MB/s] [==========================>        ] 78% ETA 0:01:21

OSX için (Kenji'nin cevabından)

tar cf - /folder-with-big-files -P | pv -s $(($(du -sk /folder-with-big-files | awk '{print $1}') * 1024)) | gzip > big-files.tar.gz

2
OSX'te du -b argümanını almaz, geri çekilmesi gereken: $ ((du -sk / folder-with | awk '{print $ 1}')) * 1024))
14'te

4
Güzel, bir astar. Bunu açıklayabilir misin? Yoksa sadece sihirli bir şekilde çalışıyor mu?
Kissaki

2
Tamam, Anladımpv $FILE.tgz | tar xzf - -C $DEST_DIR
Krzysztof Szewczyk

1
OS X için, köşeli parantez formunu aritmetik genişleme için kullanmam gerekiyordu, ki bu: tar cf - /folder-with-big-files -P | pv -s $[$(du -sk /folder-with-big-files | awk '{print $1}') * 1024] | gzip > big-files.tar.gzBu değişiklik olmadan, alıyorum-bash: syntax error near unexpected token ')'
Dean Becker

1
Dizinin boyutuna, karmaşıklığına ve parçalanmasına bağlı olarak du komutu bitene kadar ilerleme göstermediğini unutmayın.
Rooster242,

75

Bunu başarmak için pv kullanabilirsiniz . İlerlemeyi doğru olarak bildirmek için, pvne kadar bayt attığınızı bilmeniz gerekir. Bu nedenle, ilk adım boyutu (kbyte cinsinden) hesaplamaktır. Ayrıca ilerleme çubuğunu tamamen bırakabilir ve pvne kadar bayt gördüğünü söyleyeyim; bir 'o kadar çok ve o kadar çabuk yaptığını' bildirirdi.

% SIZE=`du -sk folder-with-big-files | cut -f 1`

Ve sonra:

% tar cvf - folder-with-big-files | pv -p -s ${SIZE}k | \ 
     bzip2 -c > big-files.tar.bz2

Güzel. pvMac OS X ile gelmiyor gibi görünüyor, ancak üzerinde MacPorts olan bir bilgisayarım varken bunu deneyecek. Orada ne yaptığını açıklar mısın? İlk hattın tam olarak ne yaptığından emin değilim.
Svish

4
İlk satır: kaç bayt işleneceği hakkında bilgi al. ikinci satır: pv'nin 'ilerleme' göstermesini sağlamak için ilk satırdaki boyutu kullanın. Veri aktarımı yaptığınız için, pv kaç bayt geleceğini bilmiyor.
akira

Bir ekleme: SIZE=$(($SIZE * 1000 / 1024))- Bunun özel platformumda bir tuhaflık olup olmadığını bilmiyorum, bu yüzden cevabına ekleyemiyorum: du1 kb = 1024 bayt, pv1 kb = 1000 bekliyor gibi görünüyor bayt. (Ben 10.04 Ubuntu'dayım)
11:11

2
@lzkata her zaman sorabilirsiniz duörn tercih blok boyu kullanmak du -s --block-size=1000veya sadece düz bayt ile çalışmak, mesela damla kgelen 's duve pvçağrılar. Bununla birlikte, 1024aksi belirtilmedikçe, örneğin --siaçma , ikisinin de kullanılmasını beklerdim du.
Legolas

1
ya da sadece k-eşyalarını bırakın ve sadece düz baytları kullanın ( du -sbve pv -sherhangi bir değiştirici olmadan). tüm karışıklığa son vermeli.
akira

22

daha iyi ilerleme çubuğu ..

apt-get install pv dialog

(pv -n file.tgz | tar xzf - -C target_directory ) \
2>&1 | dialog --gauge "Extracting file..." 6 50

görüntü tanımını buraya girin


2
Bu ekstraksiyon için işe yarıyor ama yine de yaratma için daha karmaşık olan komutlardan birini yapmanız gerekiyor (asıl soru buydu). Hala bunlarla birleştirilebilir; sadece daha karmaşık.
Daniel H,

17

Check out --checkpointve --checkpoint-actionkatran bilgi sayfasında seçenekleri (benim dağıtımı için olduğu gibi, bu seçenekler için açıklama kılavuz sayfasında yer almayan → RTFI).

Bkz https://www.gnu.org/software/tar/manual/html_section/tar_26.html

Bunlarla (ve belki de kendi kontrol noktası komutunuzu yazma işlevi), bir yüzde hesaplayabilirsiniz ...


3
Bu doğru cevap olmalı. Diğerleri sadece benzer bir şey elde etmek için ek araçları açıklar (varsayılan olarak kurulmaz).
Carmine Giangregorio 15:16

@Sardathrion Belki de GNU'ya tarözgü olduğundan.
phk

11

Yardımcı cevabından ilham alındı

Başka bir yol yerel tarseçenekleri kullanmaktır

FROMSIZE=`du -sk ${FROMPATH} | cut -f 1`;
CHECKPOINT=`echo ${FROMSIZE}/50 | bc`;
echo "Estimated: [==================================================]";
echo -n "Progess:   [";
tar -c --record-size=1K --checkpoint="${CHECKPOINT}" --checkpoint-action="ttyout=>" -f - "${FROMPATH}" | bzip2 > "${TOFILE}";
echo "]"

sonuç gibidir

Estimated: [==================================================]
Progess:   [>>>>>>>>>>>>>>>>>>>>>>>

tam bir örnek burada



3

MacOS hakkındaki yorumu farkettim ve @akira (ve pv) 'nin çözümünün çok daha temiz olduğunu düşündüğümde, MacOS kutumda bir hunk ve hızlı bir boşluk bırakıp tar ile bir SIGINFO sinyali gönderiyorum. İşin aslı , işe yaradı :) :) BSD benzeri bir sistemdeyseniz, bunun çalışması gerekir , ancak bir Linux kutusunda bir SIGUSR1 göndermeniz targerekebilir ve / veya aynı şekilde çalışmayabilir.

Aşağı tarafı, size sadece mevcut dosyadan ne kadar uzakta olduğunu gösteren veri akışını (stdout'ta) gösterecek olması, veri akışının ne kadar büyük olduğu hakkında hiçbir fikrinin olmadığını tahmin ediyorum.

Yani evet, alternatif bir yaklaşım katranı ateşlemek ve ne kadar ileri gittiğini bilmek istediğinizde periyodik olarak SIGINFO'lar göndermek olacaktır. Bu nasıl yapılır?

Geçici, manuel yaklaşım

Durumu geçici olarak kontrol edebilmek istiyorsanız control-T, ilgili pencerede SIGINFO sinyalini gönderecek olan pencerede (Brian Swift'in bahsettiği gibi) vurabilirsiniz. Bununla ilgili bir sorun, bunu yaptığım tüm zincirinize gönderecek, yani yapıyorsanız:

% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2

Ayrıca bzip2 raporunu tar ile birlikte durumunu da göreceksiniz:

a folder-with-big-files/big-file.imgload 0.79  cmd: bzip2 13325 running 
      14 0.27u 1.02s 

      adding folder-with-big-files/big-file.imgload (17760256 / 32311520)

Bu tar, sadece çalıştığınızın sıkışıp kaldığını veya sadece yavaş olup olmadığını kontrol etmek istiyorsanız iyi çalışır. Muhtemelen bu durumda sorunları biçimlendirme konusunda çok fazla endişelenmenize gerek yok, çünkü bu sadece hızlı bir kontrol.

Otomatik yaklaşımın türü

Bir süre alacağını biliyorsanız, ancak bir ilerleme göstergesi gibi bir şey istiyorsanız, alternatif bir tar işleminizi başlatmak ve başka bir terminalde PID'sini çıkarmak ve sonra tekrar tekrar bir sinyal gönderen bir komut dosyasına atmak olacaktır. . Örneğin, aşağıdaki komut dosyasını kullanıyorsanız (ve söylediği gibi çağırın script.sh PID-to-signal interval-to-signal-at):

#!/bin/sh

PID=$1
INTERVAL=$2
SIGNAL=29      # excuse the voodoo, bash gets the translation of SIGINFO, 
               # sh won't..

kill -0 $PID   # invoke a quick check to see if the PID is present AND that
               # you can access it..

echo "this process is $$, sending signal $SIGNAL to $PID every $INTERVAL s"
while [ $? -eq 0 ]; do
     sleep $INTERVAL;
     kill -$SIGNAL $PID;    # The kill signalling must be the last statement
                            # or else the $? conditional test won't work
done
echo "PID $PID no longer accessible, tar finished?"

Bu şekilde çağırırsanız, yalnızca hedeflediğiniz için, buna tarbenzer bir çıktı elde edersiniz.

a folder-with-big-files/tinyfile.1
a folder-with-big-files/tinyfile.2
a folder-with-big-files/tinyfile.3
a folder-with-big-files/bigfile.1
adding folder-with-big-files/bigfile.1 (124612 / 94377241)
adding folder-with-big-files/bigfile.1 (723612 / 94377241)
...

ki kabul ediyorum, çok hoş.

Son fakat en az değil - senaryolarım biraz paslanmış, bu yüzden birisi içeri girip kodu temizlemek / düzeltmek / iyileştirmek istiyorsa, hayatınız için gidin :)


2
tarKomut satırında çalışıyorsanız , yazmak control-Tbir SIGINFO gönderir. Bu bir senaryoda olsaydı, bununla yapılacaktıkill -INFO pid
Brian Swift

Tamamen unutmuşum control-T, açıkça kendi
iyiliğim

1
neden göremiyorum -SIGINFO yaparkenkill -l
Felipe Alvarez

2

Noah Spurrier'in cevabından ilham alındı

function tar {
  local bf so
  so=${*: -1}
  case $(file "$so" | awk '{print$2}') in
  XZ) bf=$(xz -lv "$so" |
    perl -MPOSIX -ane '$.==11 && print ceil $F[5]/50688') ;;
  gzip) bf=$(gzip -l "$so" |
    perl -MPOSIX -ane '$.==2 && print ceil $F[1]/50688') ;;
  directory) bf=$(find "$so" -type f | xargs du -B512 --apparent-size |
    perl -MPOSIX -ane '$bk += $F[0]+1; END {print ceil $bk/100}') ;;
  esac
  command tar "$@" --blocking-factor=$bf \
    --checkpoint-action='ttyout=%u%\r' --checkpoint=1
}

Kaynak


17
Belki küçük bir bağlam ve açıklama?
Kissaki

1

Hepsinin toplam büyüklüğü yerine dosya numarasını biliyorsanız:

alternatif (daha az doğru fakat uygun) -l seçeneğini kullanmak ve unix borusuna veri içeriği yerine dosya adlarını göndermektir.

12345 dosyamı mydir içine koyalım , komut:

[myhost@myuser mydir]$ tar cfvz ~/mytarfile.tgz .|pv -s 12345 -l > /dev/null 

Böyle bir değeri önceden (kullanım durumunuz nedeniyle) biliyor olabilir veya keşfetmek için find + wc gibi bir komut kullanabilirsiniz :

[myhost@myuser mydir]$ find | wc -l
12345

Öyleyse neden bu komutu alt komuta koymuyorsun? =)
Kirby,

tar cfvz ~/mytarfile.tgz . | pv -s $(find . | wc -l) -l > /dev/null. İşe yarıyor mu?
Kirby

1

TKYM'ye Dayalı Yöntem :

tar -v -xf tarfile.tar -C TARGET_DIR | tqdm --total $(tar -tvf tarfile.tar | wc -l) > /dev/null

1

On MacOS , ilk (örneğin tüm komutlar mevcut olduğundan emin olun ve eksik olanları yükleyin pv) kullanılarak demlemek .

Yalnızca tar sıkıştırmasız kalmak istiyorsanız , şu adımlarla gidin:

tar -c folder-with-big-files | pv -s $[$(du -sk folder-with-big-files | awk '{print $1}') * 1024] > folder-with-big-files.tar

Sıkıştırmak istiyorsanız , ile gidin:

tar cf - folder-with-big-files -P | pv -s $[$(du -sk folder-with-big-files | awk '{print $1}') * 1024] | gzip > folder-with-big-files.tar.gz

Not: İlerleme çubuğu görünmeden önce biraz zaman alabilir. Önce çalıştığından emin olmak için önce küçük bir klasörde deneyin, ardından büyük dosyalarla klasöre gidin.


0

Debian / buster AMD64'deki bazı prometheus (metrics data) yedekleri:

root# cd /path/to/prometheus/
root# tar -cf - ./metrics | ( pv -p --timer --rate --bytes > prometheus-metrics.tar )

Yeterli disk alanı olmadığı için bu işi iptal ettiniz.

Aşağıdakileri kullanarak ilerlemeyi izlemek için zstdkompresör olarak deney yapma :tarpv

root# apt-get update
root# apt-get install zstd pv

root# tar -c --zstd -f - ./metrics | ( pv -p --timer --rate --bytes > prometheus-metrics.tar.zst )
10.2GiB 0:11:50 [14.7MiB/s]

root# du -s -h prometheus
62G    prometheus

root# du -s -h prometheus-metrics.tar.zst
11G    prometheus-metrics.tar.zst
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.