2 Stimmen

\r in printf von awk nicht funktioniert?

Gefunden dieses Skript durch googeln, es hat einen Fortschrittsbalken für cp, das Problem ist, dass es Tonnen von Zeilen, wie diese erstellt:

0% [=>
0% [=>
0% [=>
0% [=>
0% [=>
0% [=>
0% [=>
0% [=>
0% [=>
0% [=>
0% [=>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>
1% [==>

Hier ist der Code des Skripts:

#!/bin/bash

   strace -q -ewrite cp --  `printf '%q ' $@` 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0

Und noch etwas: Die Schlange mit den ====== ist zu lang. Wenn man sich den 90ern nähert, gehen die ==== auf die nächste Zeile über. Wie kann ich das so bearbeiten, dass es 75 Zeilen drucken würde, da mein Standardterminal 80 Zeilen breit ist.

Edit: Ok, mir ist klar, dass das nicht funktioniert, wenn eine Datei ein Leerzeichen enthält. [Es tut einfach nichts und beendet sich direkt nachdem ich den Befehl eingegeben habe.] Irgendwelche Ideen?

Vielen Dank :)

2voto

Chris Gregg Punkte 2346

Nehmen Sie die printf " " vor dem `printf "] \r ":

#!/bin/bash

strace -q -ewrite cp --  `printf '%q ' $@` 2>&1 \
  | awk '{
    count += $NF
        if (count % 10 == 0) {
           percent = count / total_size * 100
           printf "%3d%% [", percent
           for (i=0;i<=percent;i++)
              printf "="
           printf ">"
           for (i=percent;i<100;i++)
              printf "]\r"
        }
     }
     END { print "" }' total_size=$(stat -c '%s' "${1}") count=0

Außerdem muss Ihr Terminalfenster breit genug sein, um alle Zeichen zu verarbeiten (110 Zeichen oder mehr).

2voto

Adam Liss Punkte 46031

Wenn Ihr Prozentsatz nie sinkt, brauchen Sie die zweite Option nicht. for Schleife (die den Rest der Zeile durch die Ausgabe von Leerzeichen löscht).

Besteht die Möglichkeit, dass diese Leerzeichen den Cursor in die nächste Zeile befördern, und die \r einfach den Cursor in die 1. Spalte dieser neuen Zeile setzt?

Sie können dies testen, indem Sie sicherstellen, dass Ihre Terminalbreite > 100 Zeichen ist.

Vielen Dank an Random832 für diese Information:

Um die Zeile zu verkürzen:

if (count % 10 == 0) {
       percent = count / total_size * 100
       printf "%3d%% [", percent
       # Limit the line length to 40 chars
       width = percent * 40 / 100
       for (i=0;i<=width;i++)
          printf "="
       printf ">]\r"
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X