我试图编写一个bash程序来计算目录中文件,目录,链接的数量,我试图比较给予文件的权限的第一个字符,即' s意味着我将为每个文件应用命令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
答案 0 :(得分:0)
与William Pursell's suggestion一起将变量初始化移到循环之外,您应该使用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
答案 1 :(得分:0)
如果你的bash配备了gnu ls,那么还有一种不同的方式,而不需要所有这些。 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)