Wir verwenden eine numerische Versionskontrolle für Dateien (z. B. report01.log.01, report01.log.02, report01.log.03 usw.).
Ich muss für jede Datei eine Liste mit der Anzahl ihrer Versionen erstellen.
Gibt es unter Linux eine Funktion, mit der sich dies relativ einfach erledigen lässt?
Antwort1
Ein anderer Ansatz : ls | cut -f1 -d. | uniq -c
.
awk
Ansatz :ls | awk -F. '{a[$1]++}END{for(b in a){print b,a[b]}}'
(langatmiger) perl
Ansatz:ls|perl -e 'while(<>){$a{(split(/\./,$_))[0]}++}for(sort keys %a){print "$_ $a{$_}\n"}'
Antwort2
Ich rate davon ab, die Ausgabe von ls
, find
, usw. zu analysieren (sieheParsingLs – Gregs Wikifür eine Erklärung, warum das eine schlechte Idee ist).
Stattdessen,Parametererweiterungauf einem Bash-Array kann eine Liste ohne die Dateierweiterungen erzeugen.
filelist=(*); # or filelist=(*.log.*) to be more precise
printf '%q\n' "${filelist[@]%.*}" # or echo "${filelist[@]%.*}"
Dann können Sie die Dateien einzeln bearbeiten.
for i in "${filelist[@]%.*}"; do
echo "$i";
done
Für den speziellen Zweck des OP können wir eine Bash verwendenassoziatives Arrayum die Anzahl der Versionen zu speichern.
filelist=(*.log.*)
declare -A count
for i in "${filelist[@]%.*}"; do
(( count["$i"]++ ));
done
for j in "${!count[@]}"; do
printf '%q\t%q\n' "$j" "${count[$j]}";
done | sort
report01.log 6
report02.log 6
report03.log 6
report04.log 6
report05.log 6
Antwort3
So etwas ls | sed -e 's/\.[0-9]\+$//' | sort | uniq -c
sollte tun, was Sie möchten.