확장자를 참조하지 않고 파일을 나열하는 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

등 의 출력을 구문 분석하지 않는 것이 좋습니다 ls.find구문 분석 - 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원하는 것을 수행해야 합니다.

관련 정보