Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash“不带”计数文件;查找“;_Linux_Bash_Shell_Switch Statement - Fatal编程技术网

Linux bash“不带”计数文件;查找“;

Linux bash“不带”计数文件;查找“;,linux,bash,shell,switch-statement,Linux,Bash,Shell,Switch Statement,我试图编写一个bash程序来计算目录中文件、目录、链接的数量,我试图比较赋予文件的权限的第一个字符,这意味着我将对每个文件应用ls-l命令,然后比较第一个字母,对于一个文件,我得到-rwxrwxr-x,这意味着它是一个文件,因为它开始于-和drwxrwxr-x意味着它是一个目录,因为它开始于一个“d”,我写了这段代码,但它不能正常工作,我不知道为什么,谢谢 #!/bin/bash IFS=$'\n' for f in `ls -l $1 | tail -n +2 ` do fic=0 rep=

我试图编写一个bash程序来计算目录中文件、目录、链接的数量,我试图比较赋予文件的权限的第一个字符,这意味着我将对每个文件应用ls-l命令,然后比较第一个字母,对于一个文件,我得到-rwxrwxr-x,这意味着它是一个文件,因为它开始于-和drwxrwxr-x意味着它是一个目录,因为它开始于一个“d”,我写了这段代码,但它不能正常工作,我不知道为什么,谢谢

#!/bin/bash
IFS=$'\n'

for f in `ls -l $1 | tail -n +2 `
do
fic=0
rep=0
lie=0
autre=0

t=${f:0:1}

case "$t" in
    ("-")
        fic=$((fic+1))
        ;;
    ("d")
        rep=$((rep+1))
        ;;
    ("l")
        lie=$((lie+1))
        ;;
    (*)
        autre=$((autre+1))
        ;;

esac

total=$((total+1))
done

command=$(pwd)
echo "Statistique de "$command
echo "Fichier(s) :" $fic
echo "Repertoire(s) :" $rep
echo "Lien(s) symbolique(s) :" $lie
echo "Autre :" $autre
echo "Total :" $total
除了要将变量初始化移到循环之外,还应使用
test
命令查看给定文件是符号链接、目录、普通文件还是其他文件

#!/usr/bin/env bash

fic=0
rep=0
lie=0
autre=0

for f in $1/*
do

  if [ -h "$f" ]
  then
    lie=$((++lie))
  elif [ -d "$f" ]
  then
    rep=$((++rep))
  elif [ -f "$f" ]
  then
    fic=$((++fic))
  else
    autre=$((++autre))
  fi

  total=$((++total))
done

command=$(pwd)
echo "Statistique de "$command
echo "Fichier(s) :" $fic
echo "Repertoire(s) :" $rep
echo "Lien(s) symbolique(s) :" $lie
echo "Autre :" $autre
echo "Total :" $total

如果您的bash配备了gnuls,那么还有一种不同的方法,不需要所有这些If。Bellow在我的bash中使用ls GNU版本8.25可以正常工作

echo "Statistique de "$PWD
echo "Fichier(s) :" $(ls -l |egrep '^-' |wc -l)
echo "Repertoire(s) :" $(ls -l |egrep '^d' |wc -l)
echo "Lien(s) symbolique(s) :" $(ls -l |egrep '^l' |wc -l)
echo "Autre :" $(ls -l |grep -v -e '^l' -e '^d' -e '^-' |wc -l)
echo "Total :" $(ls -l |wc -l)

看,你最好说明一个很好的理由,为什么你不想使用find,这是为这个量身定做的?你应该考虑把初始化从循环中移开。谢谢威廉,现在没问题,Inian,只是因为这是我问的,这是一个家庭作业。