ls 選項列出檔案而不參考副檔名?

ls 選項列出檔案而不參考副檔名?

我們對文件使用數位版本控制(例如:report01.log.01、report01.log.02、report01.log.03 等)

我需要做的是產生每個文件的清單以及該文件的版本數。

Linux 有沒有一個函數可以相對容易做到這一點?

答案1

另一種做法:ls | cut -f1 -d. | uniq -c

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

(囉嗦)perl方法:ls|perl -e 'while(<>){$a{(split(/\./,$_))[0]}++}for(sort keys %a){print "$_ $a{$_}\n"}'

答案2

我建議不要解析lsfind等的輸出(請參閱解析 - Greg's Wiki解釋為什麼這是一個壞主意)。

反而,參數擴充在 bash 數組上可以產生一個不含檔案副檔名的清單。

filelist=(*);                      # or filelist=(*.log.*) to be more precise
printf '%q\n' "${filelist[@]%.*}"  # or echo "${filelist[@]%.*}"

然後,單獨處理文件..

for i in "${filelist[@]%.*}"; do
   echo "$i";
done

對於OP的特殊目的,我們可以使用bash關聯數組保存版本計數。

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

答案3

類似的事情ls | sed -e 's/\.[0-9]\+$//' | sort | uniq -c應該要做你想做的事。

相關內容