2014-12-02 3 views
0
#!/bin/bash 
# File Count 


if (($# < 2)) 
then 
echo "${0}: ERROR: Incorrect number of arguments entered." 1>&2 
echo "${0}: USAGE: ${0} <directory> <filename>" 1>&2 
exit 1 
fi 

#checks for a valid number of arguments then exits if the user doesn't provide them and  shows an error message. 

if [[ ! -d "${1}" ]] 
then 
echo "${0}: ERROR: directory ${1} does not exist." 1>&2 
echo "${0}: USAGE: ${0} <directory> <filename>" 1>&2 
exit 2 
fi 
#checks for a the directory the user specified then exits if the user doesn't provide a valid directory and shows an error message. 


if [[ -d "${1}" ]] 
then 
typeset -i directoryCount=0 
for files in $(ls) 
do 
((directoryCount++)) 
done 

# if it's a directory file add 1 to the directory count 


if [[ -x "${1}" ]] 
then 
typeset -i executableCount=0 
for files in $(ls) 
do 
((executableCount++)) 
done 
# if it's a executable file add 1 to the executable count 

if [[ -f "${1}" ]] 
then 
typeset -i ordinaryCount=0 
for files in $(ls) 
do 
((ordinaryCount++)) 
done 
# if it's a ordinary file add 1 to the ordinary count 

echo The number of directory files is "${directoryCount}" 
echo The number of executable files is "${executableCount}" 
echo The number of ordinary files is "${ordinaryCount}" 

#display file counts 

Имея проблемы с этой программой, хотя я думаю, что я нахожусь на правильных линиях. Может кто-нибудь предложить понимание? Ниже приводится то, что нужно делать. Спасибо.Программа подсчета количества файлов не работает

  1. Если путь к каталогу пуст, выйдите с сообщением об ошибке.
  2. Если путь к указанному каталогу не указан в существующем каталоге, тогда выйдите с сообщением об ошибке .
  3. Если содержимое каталога не может быть прочитано, выйдите с сообщением об ошибке.
  4. Инициализировать переменные для хранения трех пунктов обвинения
  5. Петли через каждый файл в папке с именем:
  6. если посчитать каталог как таковые;
  7. , если он является исполняемым граф как такой
  8. если считать это обычный файл как таковой
  9. выводить результаты.
+0

'if [[-d" $ {1} "]]' всегда будет правдой, так как вы уже проверили, что противоположное значение неверно. Не [parse ls] (http://mywiki.wooledge.org/ParsingLs) просто используйте 'для файла в *'. Здесь вопрос о том, как добавить логику 'is executable'? –

+0

Зачем нужен второй аргумент, который никогда не используется? Почему бы просто не использовать 'find' и не выводить вывод на' wc'? –

+0

Это всегда логика, с которой я борюсь во время этих вещей, совершенно новых для этого типа программирования, а также – user3017497

ответ

1

Я бы хотел начать с того, что я приготовил после прочтения вашего сценария и описания. Я думаю, что это довольно понятно. Ваши требования 1 и 3 не реализованы, так как для 1 я считаю, что возврат к текущему рабочему каталогу более полезен.

Это очень простой сценарий, который должен дать вам много пространства для улучшения:

#!/usr/bin/env bash 

# Either set DIR upon calling or submit a parameter or fall back to the CWD 
: ${DIR:="${1:-.}"} 

if [ ! -d "${DIR}" ]; then 
    echo "${0##*/}: ERROR: Directory '${DIR}' does not exist." 
    echo "${0##*/}: USAGE: ${0##*/} <directory>" 
    exit 1 
else 
    echo "Investigating directory: ${DIR}" 
fi 

function initVars() { 
    directoryCount=0 
    executableCount=0 
    ordinaryCount=0 
    unknownTypeCount=0 
} 

function checkOwnerExecutable() { 
    local permStr=$1 
    # return 0 if executable bit is set, otherwise 1 
    [ "x${owner//x/}" != "x${owner}" ] && return 0 || return 1 
} 

initVars 
while read entry; do 
    #echo "entry: ${entry}" 
    eval ${entry} 
    case "$type" in 
     "Directory") 
      let directoryCount+=1 
      ;; 
     "Regular File") 
      let ordinaryCount+=1 
      checkOwnerExecutable $owner && let executableCount+=1 
      ;; 
     *) 
      echo "Unknown type=$type with name=$name" 
      let unknownTypeCount+=1 
      ;; 
    esac 
done < <(stat -f 'name="%N" type="%HT" owner="%SHp" group="%SMp" other="%SLp"' ${DIR}/* ${DIR}/.*) 

echo "The number of directory files is ${directoryCount}" 
echo "The number of executable files is ${executableCount}" 
echo "The number of ordinary files is ${ordinaryCount}" 
echo "The number of unknown type files is ${unknownTypeCount}" 

А вот выход для/TMP:

$ ./fileCount.sh /tmp 
Investigating directory: /tmp 
Unknown type=Socket with name=/tmp/textmate-501.sock 
Unknown type=Socket with name=/tmp/.prl_pcsc_gate 
The number of directory files is 11 
The number of executable files is 1 
The number of ordinary files is 4 
The number of unknown type files is 2 

Она включает/отсчитывает " «. и ".." в качестве каталогов. Если вы этого не хотите, отрегулируйте команду stat в конце цикла while.

Смежные вопросы