Compter les fichiers et les répertoires en utilisant un script shell
Je suis en apprentissage de l'écriture de scripts bash et ont écrit un script pour compter les fichiers et répertoires dans le répertoire qui est fourni en argument. - Je avoir de travail d'une façon qui me semble bizarre et je me demande si il existe un moyen plus simple de le faire.
J'ai commenté le code du travail, mais elle a laissé dans une comparaison. Je suis en train d'essayer d'obtenir le for
-boucle de travail, au lieu d'utiliser if
les instructions à l'intérieur de détecter si un élément donné de l'emplacement d'un fichier ou d'un répertoire.
Modifier: je viens de constater que le code commenté compte tous les fichiers et répertoires dans les sous-répertoires de l'emplacement ainsi! Est-il possible de prévenir cette situation et compte le nombre de fichiers et répertoires de la ville?
#!/bin/bash
LOCATION=$1
FILECOUNT=0
DIRCOUNT=0
if [ "$#" -lt "1" ]
then
echo "Usage: ./test2.sh <directory>"
exit 0
fi
#DIRS=$(find $LOCATION -type d)
#FILES=$(find $LOCATION -type f)
#for d in $DIRS
#do
# DIRCOUNT=$[$DIRCOUNT+1]
#done
#for f in $FILES
#do
# FILECOUNT=$[$FILECOUNT+1]
#done
for item in $LOCATION
do
if [ -f "$item" ]
then
FILECOUNT=$[$FILECOUNT+1]
elif [ -d "$item" ]
then
DIRCOUNT=$[$DIRCOUNT+1]
fi
done
echo "File count: " $FILECOUNT
echo "Directory count: " $DIRCOUNT
Pour une raison quelconque, la sortie de la for
en boucle, peu importe où je l'emplacement, renvoie toujours:
File count: 0 , Directory count: 1
source d'informationauteur Alan Smith
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas à parcourir la liste des fichiers dans le répertoire; ajouter
/*
après$LOCATION
. Votre script devrait ressembler à:Comme indiqué par dogbane, tout en ajoutant
/*
compte seulement les fichiers qui ne commence pas avec.
; pour ce faire, vous devez effectuer les opérations suivantes:Utilisation
find
comme indiqué ci-dessous. Cette solution permettra de compter les noms de fichiers avec des espaces, sauts de ligne et des fichiers de configuration utilisateur correctement.Noter que le
DIRCOUNT
comprend le répertoire courant (.
). Si vous ne le souhaitez pas, soustrayez 1.Juste de résoudre le problème, vous pouvez utiliser:
find
va chercher tous les fichiers (-type f
) ou des répertoires (-type d
) de manière récursive sous$LOCATION
;wc -l
va compter le nombre de lignes affichés dans chaque cas.Cependant, si vous voulez apprendre, le script bash peut être une meilleure façon. Quelques commentaires:
$LOCATION
uniquement (pas de manière récursive, en vertu de leurs sous-dossiers, etc), vous pouvez utiliserfor item in $LOCATION/*
où la*
permettra d'élargir la liste des fichiers/répertoires dans le$LOCATION
répertoire. Le manque*
est pourquoi votre script d'origine renvoie 0/1 (parce que l'$LOCATION
répertoire lui-même est le seul élément pris en compte).$LOCATION
est en fait un répertoire avec[ -d $LOCATION ]
.$(( ... ))
par exempleFILECOUNT=$(( FILECOUNT + 1 ))
.find
avec une boucle.Exemple:
... am wondering if there is a simpler way of doing it.
Si tu le dis 😉
Sinon, réduire votre script à
Pour le répertoire courant, n':
Utilisation
Pour le nombre de fichiers, et
Pour le comptage des répertoires