我需要编写一个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(目录名称)为参数执行脚本后。
答案 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
}
}'