2016-07-08 11 views
3

Ich versuche, ein Skript zu erstellen, das eine Erweiterung erhält und in zwei Spalten den Benutzer und die Anzahl der Dateien, die der Benutzer mit dieser Erweiterung besitzt, meldet. Die Ergebnisse müssen in report.txt gedruckt werdenBerichterstattung mit Schnitt und Grep

Hier ist mein Code.

#!/bin/bash 

#Uncoment to create /tmp/test/ with 50 txt files 
#mkdir /tmp/test/ 
#touch /tmp/test/arch{01..50}.txt 

clear 

usage(){ 
    echo "The script needs an extension to search" 
    echo "$0 <extension>" 
} 

if [ $# -eq 0 ]; then 
    usage 
    exit 1 
fi 

folder="/tmp/test/" 
touch report.txt 
count=0 
pushd $folder 

for file in $(ls -l); do 
    grep "*.$1" | cut -d " " -f3 >> report.txt 
done 

popd 

Das Programm läuft einfach endlos. Und ich zähle nicht einmal die Dateien für jeden Benutzer. Wie kann ich das nur mit Grep und Cut lösen?

+0

Können Sie einen Eingang und erwartete Ausgabe geben? – Fazlin

+3

'grep" *. $ 1 "| ... greps ins stdin. Dort wartet dein Programm für immer. Ich habe kein Dateiargument oder es fehlt eine Eingabe-Pipe. –

+0

Sie könnten die for-Schleife durch etwas wie 'find $ Ordner-Name" *. $ 1 "-printf"% P \ t% u \ n ">> report.txt' und dann etwas wc ersetzen. –

Antwort

2

Mit GNU stat:

stat -c '%U' *."$1" | sort | uniq -c | awk '{print $2,"\t",$1}' > report.txt 

Wie von mklement0 unter BSD/OS X müssen Sie eine -f Option mit stat verwenden:

stat -f '%Su' *."$1" | sort | uniq -c | awk '{print $2,"\t",$1}' > report.txt 

Edit:

zu verarbeiten Sie viele Dateien und vermeiden Sie die Beschränkung der Argumentanzahl, verwenden Sie besser printf zum stat Befehl geleitet (nochmals vielen Dank mklement0):

printf '%s\0' *."$1" | xargs -0 stat -c '%U' | sort | uniq -c | awk '{print $2,"\t",$1}' 
+1

Schön gemacht; um Ihre GNU 'stat'-Syntax mit der für BSD/OSX' stat' zu ergänzen: '-c '% U'' muss durch' -f'% Su'' ersetzt werden. – mklement0

+1

Gute Antwort. Nur eine Sache. Abhängig von der Anzahl der Dateien, die der Glob enthüllt, kann die Argumentliste für 'stat' zu lang werden. Eine "find" -basierte Lösung wäre stabiler. – hek2mgl

+1

@ hek2mgl: Es ist eine berechtigte Sorge, aber Sie könnten das mit 'printf '% s \ 0' *." $ 1 "| beheben xargs -0 stat ... '(da' printf' ein Bash_builtin_ ist, unterliegt es nicht der maximalen Länge der Befehlszeilenlänge). – mklement0

0

Sie keine Schleife für diese müssen (es sei denn, Sie später Schleife über mehrere Ordner müssen), und die Änderung der Arbeitsverzeichnis in ein Skript selten notwendig. Außerdem wird das Lesen der ls Ausgabe normalerweise nicht empfohlen.

Hier ist eine Version, die die Schleife ersetzt und verwendet du:

ext="$1" 

printf "Folder '%s':\t" "$folder" >>report.txt 

du -hc "$folder"/*."$ext" | sed -n '$p' >>report.txt 
+1

Ich denke, das OP will die _count_ von Dateien, nicht die kombinierte Speichergröße. Außerdem fehlt Ihnen der Benutzername Gruppierung nach Besitzer. – mklement0

+0

@ mklement0 Ich interpretierte "Anzahl der Dateien" als "die kombinierte Größe der Dateien". Es ist nicht genau klar. Ich nahm auch an, dass $ Ordner später verwendet würde, um Benutzernamen (Home-Verzeichnisse) zu identifizieren. – Kusalananda