2017-01-21 3 views
2

Ich brauche auch den Namen des Verzeichnisses, um als auch ausgegeben zu werden. Was ich konnte, ist die Ausgabe der Gesamtzahl von Zeilen in allen Verzeichnissen mit dem Verzeichnisnamen.Wie man alle Zeilen der Dateien zählt

#!/usr/bin/env bash 

for dir in */; do (
    cd "$dir" 
    count=$(find . -name '*.c' -print0 | xargs -0 grep '[;]$' | wc -l) 
    echo -e "${count}\t${dir}" 
) done 

Wenn Sie Nummern für jedes Unterverzeichnis:

find . -name '*.c' | xargs wc -l | xargs -I{} dirname {} | xargs -I{} dirname {} 
+0

Können Sie Ihre Anforderungen mit einem geeigneten Beispiel wieder laufen? Kannst du es näher erklären? – Inian

+0

@Inian, im Grunde möchte ich den Verzeichnispfad und die Anzahl der Zeilen mit einem Semikolon in diesem Verzeichnis (Anzahl der Zeilen aus allen Dateien in diesem Verzeichnis) enden. Ich kann die Gesamtzahl der Zeilen, die mit einem Semikolon enden, im Verzeichnis mit 'find' ausgeben. -name '* .c' -print0 | xargs -0 grep '[;] $' | wc -l 'aber ich habe keine Ahnung, wie man die Ausgabe nach Verzeichnis bekommt. – Theseven7

+0

@Inian, tat es. – Theseven7

Antwort

0

Ich habe eine Mischung aus bash Befehle durcheinander meist GNU -spezifische, stellen Sie sicher, dass Sie sie haben, GNU grep und GNU Awk

find . -type f -print0 | xargs -0 grep -c ';$' | \ 
    awk -F":" '$NF>0{cmd="dirname "$1; while ((cmd | getline result) > 0) {printf "%s\t%s\n",result,$2} close(cmd) }' 

Die Idee ist grep -c gibt die Musterzahl in Format, file-name:count, die ich bin übergibt es an GNU Awk, um die Dateien zu filtern, deren Anzahl größer als Null ist, und das Verzeichnis der Datei, die es enthält, und die Zählung selbst zu drucken.

Als Phantasie Einzeiler, wie sie es in diesen Tagen nennen,

find . -type f -print0 | xargs -0 grep -c ';$' | awk -F":" '$NF>0{cmd="dirname "$1; while ((cmd | getline result) > 0) {printf "%s\t%s\n",result,$2} close(cmd) }' 
+0

Macht den Job! Danke für die Erklärung. – Theseven7

0

Hier ist ein Skript

#!/usr/bin/env bash 

for dir in $(find . -type d); do (
    cd "$dir" 
    count=$(find . -maxdepth 1 -name '*.c' -print0 | \ 
     xargs -0 grep '[;]$' | wc -l) 
    echo -e "${count}\t${dir}" 
) done 

Mit -maxdepth 1 stellt sicher, dass nur im aktuellen Verzeichnis erfolgt die Berechnung, nicht seine Unterverzeichnisse. So wird jede Datei einmal gezählt.

+0

gibt es eine Möglichkeit, die Schleife zu ändern, um auch in den Unterverzeichnissen zu suchen? – Theseven7

+0

Ein weiteres Skript hinzugefügt. –

Verwandte Themen