Filter für Anzahl Dateien + Größe

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Filter für Anzahl Dateien + Größe

Beitrag von linuxCowboy » 02.03.2013 01:41:14

Ich will das in meinem ls-Arsenal

Code: Alles auswählen

alias ls="ls --group-directories-first --quoting-style=shell --time-style='+%d.%m. %Y %T' --color=auto -p"
alias l=ls
alias la="l -A"
alias ll="l -l"
alias lla="ll -A"
alias llr="lla -R"
alias lls="lla -Sr"
alias llt="lla -tr"
haben:

Code: Alles auswählen

alias pc='perl -apE '\''++$i and $x+=$F[4] if $_=~/^-/;END{$x=~s/(?<=\d)(?=(\d\d\d)+\b)/./g;say" $i Files  $x Bytes"}'\'
/bin$ ll|pc
total 5364
-rwxr-xr-x 1 root root 811156 10.04. 2010 14:03:56 bash
-rwxr-xr-x 3 root root 26356 27.12. 2011 04:05:01 bunzip2
-rwxr-xr-x 1 root root 408588 15.11. 2010 15:40:08 busybox
...
-rwxr-xr-x 1 root root 1733 20.01. 2010 19:58:07 zless
-rwxr-xr-x 1 root root 2416 20.01. 2010 19:58:07 zmore
-rwxr-xr-x 1 root root 4952 20.01. 2010 19:58:07 znew
102 Files 5.150.704 Bytes

Code: Alles auswählen

perl -apE '++$i and $x += $F[4] if ($_ =~ /^-/); END { $x =~ s/(?<=\d)(?=(\d\d\d)+\b)/./g; say " $i Files  $x Bytes" }'
-a autosplit: $_ in @F
-p loop with print
-E expression mit say ohne use
perlretut: Looking ahead and looking behind

Aliase nehmen keine Parameter. So wähle ich die Files vorher feingranular aus und schicke sie in die Pipe.

Einfacher wäre:

Code: Alles auswählen

alias gc="g -c ^-"
Wie macht ihr das?

Habt ihr eine Erklärung, wieso es für so eine wesentlich Information keine Option gibt?

-der_linux_cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Filter für Anzahl Dateien + Größe

Beitrag von Cae » 02.03.2013 03:22:38

Vermutlich wuerde man find mit einer -maxdepth 1 und -type f verwenden. Ist eleganter, als ls-Output zu parsen. Das wuerde man dann per xargs an du weiter verfuettern... aber du guckt sich die tatsaechliche Groesse an und nicht die im Inode vorgegebene [1]. Das braucht laenger, weil tatsaechlich Dateien eingelesen werden und nicht das Dateisystem selbst gefragt wird. Nicht zielfuehrend.

Mich interessiert meistens nicht die (Gesamt-)Groesse, sondern evtl. die Anzahl, das fuehrt meistens zu find | wc -l. Zu dem Parameter-Problem hab' ich ein ~/bin/, das im $PATH drin steht und ein paar Skripte und kompilierte C-Programme enthaelt. Sie decken Funktionen ab, die einem der Unix-Baukasten nur kompliziert oder nicht liefert. Z.B. bincheck (C), das ist ungefaehr die Umkehrung von strings, es liest eine angegebene Datei oder von stdin und schreibt fuer jedes nicht druckbare Zeichen den Wert, Offset und Zeile/Zeichen auf stdout. Damit hatte ich mal Bitkipper in eigentlich Klartextdateien gesucht.

Gruss Cae

[1] Stichwort spare file. Z.B. ist ein laut Inode 2 GB grosses spare file mit 100 MB Nutzdaten auch nur 100 MB gross.
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Filter für Anzahl Dateien + Größe

Beitrag von linuxCowboy » 02.03.2013 07:32:14

find für ein directory listing finde ich übertrieben. Außerdem wirst du das sicher nicht jedesmal neu eingeben wollen. Also läuft es auch auf ein Alias oder eine Funktion hinaus. Und da kann, und muss, man sich das Format dann einstellen. Egal ob mit find, parsen in der bash oder perl.

Für Spezialfälle bleibt find unbenommen. Allerdings brauche ich das eher selten, da meine find Shell-Funktionen den Großteil abdecken.

Die disk usage der sparse-files ist in total enthalten, wenn nach der Information Bedarf besteht.

ls ist okay. Es sollte nur, wenn ich ein Verzeichnis liste, die Information, wie viele Dateien ich da eigentlich aufliste, zum default gehören. Auf jeden Fall aber per Option zuschaltbar sein. Das sieht selbst Dödel-DOS so.

Ich habe meinen "Werkzeugkasten" in .bash_aliases. Nur kurz gesourced und ich bin zu Hause! ;-)

Ich hatte unter Windows mein eignes strings: stringX. Texte aus EXEs fischen, mit Umlauten, Unicode, Aufstellung Codepage 850 und 1252 und character-chart extendend Ascii.

(unter GNU/Linux bisher noch nicht gebraucht: 1. ist alles englisch und 2. open source...nix mehr zu cracken :-/

-der_linux_cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Filter für Anzahl Dateien + Größe

Beitrag von rendegast » 02.03.2013 10:41:05

Ich hätte noch einen

Code: Alles auswählen

$ ll; ll 2>/dev/null | awk '$1~/^[l-]/ {print SUM+=$5,"Bytes\t",NUM+=1,"Dateien"}' | tail -n1
(zählt so Dateien und Links)
in Richtung einer Funktion o.ä.

Code: Alles auswählen

 LLER="ls -l -R"; $LLER; $LLER 2>/dev/null | awk '$1~/^[l-]/ {print SUM+=$5,"Bytes\t",NUM+=1,"Dateien"}' | tail -n1
Für die Dezimalpunkte vielleicht mit printf.

Und zur Zeit, die wird nur beim ersten 'ls' verbraucht (zBsp. /usr/ rekursiv in 70s, und da wegen der Konsolenanzeige),
das zweite mit dem awk ist dann eigentlich augenblicklich.

Stark komplexer müßte es natürlich bei einem rekursiven 'ls' per Verzeichnis werden,
aber auch der obige perler gibt das nicht wieder.
Als Trenner bietet sich vielleicht das "insgesamt"/"total" an?
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Filter für Anzahl Dateien + Größe

Beitrag von linuxCowboy » 02.03.2013 12:06:54

Originell! :THX:

Ich schau mir grad die Sources an.

Ich will den Hack! Ein Feeling fast wie in alten Zeiten.
(Nur gibts hier keinen EXE-Packer, Anti-Debugging und Assembler... :lol:

Wenns hier schon den Code Frei-Haus gibt, machen wirs doch gleich in C.

Bei der Perl-Pipe sind nämlich die Farben weg. Und ich würde die Option sowieso immer einschalten.

Der Perler könnte sicher auch rekursiv erkennen. Nur wäre es dann wohl kein Einzeiler mehr. Und immer noch nur eine Pipe!

-der_linux_cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Filter für Anzahl Dateien + Größe

Beitrag von r900 » 02.03.2013 12:35:54

linuxCowboy hat geschrieben:Aliase nehmen keine Parameter.
Dafür gibt es in bash Funktionen. Die kannst du z.B. in deiner ~/.bashrc definieren und dann mit einem Eintrag "export -f <funktionsname>" verfügbar machen.

Code: Alles auswählen

myls(){ ls -l "$@" | perl_oder_was_auch_immer ;  }
export -f myls
Einziger Nachteil, immer noch eine pipe. Aber ein Ei ist eben ein Ei und kein Steak.
http://mywiki.wooledge.org/BashFAQ/ ist vielleicht auch was für dich.

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Filter für Anzahl Dateien + Größe

Beitrag von linuxCowboy » 04.03.2013 16:01:41

Its done.

Code: Alles auswählen

~$ llr /usr
/usr:
total 212
drwxrwxr-x   2  501   501 69632 01.03. 2013 00:37:48 bin/
drwxr-xr-x   2 root root   4096 07.01. 2013 02:05:36 games/
drwxr-xr-x  50 root root  20480 28.02. 2013 05:45:43 include/
 ...
-rw-rw-rw- 1 root root  1079 27.01. 2003 18:44:04 traverse.hh
-rw-rw-rw- 1 root root  8438 05.10. 2002 20:06:32 xmj3ts.cc
-rw-rw-rw- 1 root root  1136 29.08. 2003 05:57:54 xmj3ts.hh
  45 Files  0 Links  0 Dirs  -  185.631 Bytes 
  133.137 Files  25.962 Links  18.280 Dirs  #  4.136.899.806 Bytes
Einfach an der richtigen Stelle die Ausgabe einschieben, bzw. aufsummieren und am Ende ausgeben.

Der Dezimalpunkt ist eine kleine Funktion in feinstem C:

Code: Alles auswählen

// my pretty printer
char *
pretty (char *buffer, void *size, bool bFloat)
{
	char aBuf[50];
	char *pa = aBuf, *pb = buffer;

	if (bFloat)
		sprintf (aBuf, "%0.f", *(double*) size);
	else
		sprintf (aBuf, "%d", *(int*) size);

	int iLen = strlen (aBuf);

	while (iLen) {
		*pb++ = *pa++;

		if (--iLen && ! (iLen % 3))
			*pb++ = '.';
	}
	*pb = '\0';

	return buffer;
}
Für Datei und Co. integer, für die Größe float. Wird mehrfach gebraucht, also eine Funktion. Jeder Wert hat seinen eigenen temp buffer, die mit sprintf auf den output buffer drucken. Nun muß ich eben beide typen in eine Funktion bekommen.

Kann man sicher auch noch anders lösen.

Mein ganzer Stolz ist der Punktgenerator!

Mein System ist komplett englisch, um mir das Elend mit den locales vom Hals zu halten. Also Spaßiges wie setlocale oder LC_NUMERIC fällt flach. Selbst ist der Mann!

Ich hatte erst mit extra Countervariablen und Stringumkehrung hantiert. Bis mir die Idee mit der Stringlänge kam. Einfach von vorn anfangen wegzuschreiben, die Länge dekrementieren und modulo 3 nehmen, dann passt's schon. :)

Die Option journal (wie ich sie nenne) ist per default on, aber läßt sich abschalten:

Code: Alles auswählen

"  -J, --no-journal           in a long listing, dont't add up files and dirs"
z.B. für Skripte, wo man ein explizites `ls -l file` braucht.

War ein Spaß die Sache. Jetzt ist es so, wie ich mir das vorgestellt habe!

-der_linux_cowboy
-der_linux_cowboy --- Besser werden! ... f*** w$$

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Filter für Anzahl Dateien + Größe

Beitrag von rendegast » 04.03.2013 18:00:47

Dezimalpunke "zu Fuß"

Code: Alles auswählen

$ echo 1341341351345 | rev | sed 's@\([0-9][0-9][0-9]\)@\1.@g;s@\.$@@' | rev
1.341.341.351.345

$ echo  341341351345 | rev | sed 's@\([0-9][0-9][0-9]\)@\1.@g;s@\.$@@' | rev
341.341.351.345
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

linuxCowboy
Beiträge: 287
Registriert: 05.02.2013 19:47:41

Re: Filter für Anzahl Dateien + Größe

Beitrag von linuxCowboy » 21.03.2013 09:03:43

"zu Fuß"

Code: Alles auswählen

{ rev | sed 's@\([0-9][0-9][0-9]\)@\1.@g;s@\.$@@' | rev;} <<< 341341351345
341.341.351.345
bug:

Code: Alles auswählen

{ rev | sed 's@\([0-9][0-9][0-9]\)@\1.@g;s@\.$@@' | rev;} <<< `e 1341341351345 341341351345`
1.341.341.351.345 .341.341.351.345
bug:

Code: Alles auswählen

{ rev | sed -r 's/([0-9]{3})/\1./g;s/\.$//' | rev;} <<< `declare -i j=0;for i in {1..7};do j=$j$i;e $j;done`
1 12 .123 1.234 12.345 .123.456 1.234.567
fix:

Code: Alles auswählen

perl -pe 's/(?<=\d)(?=(\d\d\d)+\b)/./g' <<< `declare -i j=0;for i in {1..7};do j=$j$i;e $j;done`
1 12 123 1.234 12.345 123.456 1.234.567
-der_linux_cowboy --- Besser werden! ... f*** w$$

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: Filter für Anzahl Dateien + Größe

Beitrag von Natureshadow » 21.03.2013 09:31:08

"Alias" mit Parametern:

Code: Alles auswählen

foo() { command bar "$@" }
War das die ursprüngliche Frage?

Antworten