从给定文件夹开始打印文件名及其出现数量的脚本

时间:2019-04-02 10:42:04

标签: bash

我需要编写一个shell脚本,该脚本以给定的文件夹名称开头,作为参数将打印出其中的文件夹和文件的名称,以及每个名称在给定文件夹中出现多少次。 edit 我只需要检查它们的名称,而无需考虑文件扩展名。

#!/bin/bash
folder="$1"
for f in "$folder"
do
  echo "$f"
done

并且我希望看到类似的东西(如果我在名为dir的目录中有3个具有相同名称和不同扩展名的文件,例如x.html,x.css,x.sh等)

x
3 times

以dir(目录名称)为参数执行脚本后。

3 个答案:

答案 0 :(得分:0)

您可以尝试一下吗

#!/bin/bash
IFS=$'\n' array=($(ls))
iter=0;
for file in ${array[*]}; do
    filename=$(basename -- "$file")
    extension="${filename##*.}"
    filename="${filename%.*}"
    filenamearray[$iter]=$filename
    iter=$((iter+1))
done 

for filename in ${filenamearray[@]}; do
echo $filename;
grep -o $filename <<< "${filenamearray[@]}" | wc -l
done

答案 1 :(得分:0)

find命令已经为您完成了大部分工作。

find . -printf "%f\n" |
sort | uniq -c

如果您的文件名包含换行符,则无法正常工作。

如果您的find不支持-printf,请尝试

find . -exec basename {} \; |
sort | uniq -c

要仅限制文件名或目录名,请在操作(-type f-type d)之前分别添加-exec-printf

如果您确实要删除扩展程序,请尝试

find .... whatever ... |
sed 's%\.[^./]*$%%' |
sort | uniq -c

答案 2 :(得分:0)

您可以尝试使用find和awk

find . -type f -print0 |
awk '
  BEGIN {
    FS="/"
    RS="\0"
  }
  {
    k = split( $NF , b , "." )
    if ( k > 1 )
      sub ( "."b[k] , "" , $NF )
    a[$NF]++
  }
  END {
    for ( i in a ) {
      j = a[i]>1 ? "s" : ""
      print i
      print a[i] " time" j
  }
}'