/ / Zählen aller Dateien / Verzeichnisse in einem angegebenen Verzeichnis - bash / shell scripting - Bash, Shell, Unix, Skripting

Zählen aller Dateien / Verzeichnisse in einem angegebenen Verzeichnis - bash / shell scripting - bash, shell, unix, scripting

Das fertige Produkt ist rekursiv gemeintZählen Sie alles in einem angegebenen Verzeichnis oder die aktuelle, wenn keine Argumente eingegeben werden. Im Moment versuche ich nur, es in den angegebenen Verzeichnissen zu zählen. Ich habe Schwierigkeiten, die letzten Aussagen überhaupt zu zählen. Es gibt 0 Dateien im Verzeichnis zurück.

Könnte mir jemand irgendwelche Tipps geben? Ich bin noch ein Anfänger, also nimm es ruhig an, danke!

#!/bin/bash
#A shell script program that counts recursively how many directories/files exist in a given directory.

declare -i COUNT=0
declare -i COUNT2=0
#The script will treat COUNT as an integer that is 0 until modified.
if [ "$#" -eq "0" ]
then

for i in *
do
((COUNT++))
done
((COUNT--)) #This is done because there is always an overcount of 1.
echo "There are $COUNT files and/or directories in the current directory here."
fi

if [[ -d $1 ]]
then
for i in $1
do
((COUNT++))
done
((COUNT--)) #This is done because there is always an overcount of 1.
echo "There are $COUNT files and/or directories in $1."
fi

if [[ -d $2 ]]
then
for i in $2
do
((COUNT2++))
done
((COUNT2--)) #This is done because there is always an overcount of 1.
echo "There are $COUNT2 files and/or directories in $2."
fi
exit 0

Antworten:

4 für die Antwort № 1

Erstens können Sie mit einem Einzeiler machen, was Sie wollen:

find . | wc -l

find . bedeutet "Suche im aktuellen Verzeichnis und allen Unterverzeichnissen". Da es kein anderes Argument gibt, wird es einfach alles auflisten. Dann benutze ich ein Rohr und wc, was für "Wortzählung" steht. Das -l Option bedeutet "nur die Anzahl der Zeilen ausgeben".

Nun, für Ihren Code, hier ein paar Tipps. Erstens verstehe ich nicht wirklich, warum du deinen Code dreimal wiederholst (für 0, $ 1 und $ 2).

dir="$1"
if [ -z "$dir" ]; then dir="."; fi

Sie speichern den Wert des Befehlszeilenarguments in $ dir und wenn keiner angegeben ist (-z bedeutet "ist leer"), weisen Sie dir einen Standardwert zu.

for i in $1 Ich werde nicht arbeiten, wenn $1 ist der Pfad zu einem Verzeichnis. Also, stattdessen können Sie verwenden

for i in $(ls $dir)

Außerdem zählen Sie in Ihrem Code nicht rekursiv. Ist es freiwillig oder wissen Sie nicht weiter?