Uczę się skryptowania bash i napisałem skrypt, aby policzyć pliki i katalogi w katalogu dostarczonym jako argument. Działa to w jedną stronę, co wydaje mi się dziwne i zastanawiam się, czy istnieje prostszy sposób robienia tego.Policz pliki i katalogi przy użyciu skryptu powłoki
Skomentowałem kod, który zadziała, ale pozostawił go jako porównanie. Próbuję uzyskać poprawne działanie for
, używając w tym celu instrukcji if
, aby wykryć, czy element w danej lokalizacji jest plikiem lub katalogiem.
Edytuj: Właśnie się dowiedziałem, że skomentowany kod zlicza wszystkie pliki i katalogi w podkatalogach danej lokalizacji! Czy istnieje sposób, aby temu zapobiec i po prostu policzyć pliki i katalogi danej lokalizacji?
#!/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
Z jakiegoś powodu wyjście for
-loop, bez względu na to gdzie mogę wskazać lokalizację, zawsze powraca:
File count: 0 , Directory count: 1
Twój cały skrypt jest uszkodzony, jeśli w nazwach plików występują spacje. Jak się domyślacie, moją pierwszą radą jest: Użyj więcej cytatów! –
Kolejna uwaga: mogę powiedzieć, że twoje źródła do nauki bash są nieaktualne i nie pokazują dobrych praktyk. –
Po rozszerzeniu nazwy pliku rozważ czytanie: http://bash.cyberciti.biz/bash-reference-manual/Filename-Expansion.html – hovanessyan