ls-Option zum Auflisten von Dateien ohne Bezugnahme auf die Erweiterung?

ls-Option zum Auflisten von Dateien ohne Bezugnahme auf die Erweiterung?

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.

awkAnsatz :ls | awk -F. '{a[$1]++}END{for(b in a){print b,a[b]}}'

(langatmiger) perlAnsatz: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 -csollte tun, was Sie möchten.

verwandte Informationen