2013-07-28 2 views
1

Я пытаюсь сохранить свою функцию inspect_files на принципе единой ответственности, я знаю, что я мог бы легко вычислить количество файлов внутри этой функции и распечатать ее там, но есть ли более элегантное решение для подсчета файлов, чем это?Подсчет файлов с Bash

(Обратите внимание, я не хочу рекурсивный количество файлов.)

# Snippet: 

dir_name="$HOME/$1" 

inspect_files() { 
    local content 
    for content in "$dir_name"/*; do 
    printf "%s\n" "${content##*/}" 
    done 
    count_files "$dir_name" 
} 

count_files() { 
    local count 
    local dir="$1" 
    count=$(ls -1 "$dir_name" | wc -l) 
    printf "\nTotal: %d\n" "$count" 
} 

if is_found "$dir_name"; then 
    inspect_files 
else 
    echo 'Not a directory.' 
fi 
+0

используйте утилиту wc. 'wc -l' печатает количество строк. 'ls $ dir_name/* | wc -l' должен заставить вас работать. или 'count = $ (ls $ dir_name/* | wc -l)' для хранения вывода в count. – hetepeperfan

+0

Должно быть 'ls -1', чтобы каждое имя файла указывалось по одному в строке для использования с' wc'. Не все существующие реализации 'ls' делают это, независимо от того, является ли вывод терминальным устройством или нет. Существует также проблема псевдонимов, используемых для 'ls' с указанной опцией' -C', поэтому для переопределения этой опции необходимо использовать опцию '-1'. –

ответ

1

насчет:

list_and_count_files() 
{ 
    local content 
    local count 
    count=0 
    for content in "${1:-.}"/*; do 
    printf "%s\n" "${content##*/}" 
    ((count++)) 
    done 
    printf "\nTotal: %d\n" "$count" 
} 

Это название более точное описание того, что делает ваша оригинальная функция. Обратите внимание, что анализируемый каталог передается в качестве аргумента функции, но по умолчанию используется значение . (текущий каталог), если вы ничего не пропускаете. Это отделяет функцию от переменной $dir_name, что намного лучше для изоляции.

+0

Это было мое оригинальное решение, я просто хотел знать, есть ли лучший способ подсчета файлов, кроме того, как я его написал. Я хотел избежать необходимости распечатывать все файлы в каталоге и печатать количество файлов в одной и той же функции. Это делает меня «непростым», потому что я чувствую, что он должен делать только одно. Мне нравится то, что вы сделали с аргументом массива, у меня всегда были проблемы с этим ха-ха. – theGrayFox

+0

Ваша написанная функция имеет ненужную связь через переменную '$ dir_name' (как отмечено в моем комментарии). Как написано, он вызывает и другую функцию. Если вы хотите, чтобы функции были независимыми, не используйте функцию 'inspect_files'' count_files'; вызывать функции отдельно. Однако, если вы всегда будете называть их в тандеме (так что вы всегда хотите список и счет), то вам лучше работать с одной функцией, которая выполняет всю работу. Если вы когда-либо вызывали 'count_files' без первого вызова' inspect_files', тогда две функции гарантированы. Это зависит от того, как вы будете их использовать. –

+0

Я вижу, я думаю, что я мог подумать слишком далеко от этой проблемы. Когда я впервые занялся этим, я просто распечатал файлы и подсчитал их в той же функции, что и вы сказали. Затем я вернулся к нему, пытаясь понять, могу ли я изолировать их. Вы правы, иногда лучше держать вещи простыми. Цените ответ. – theGrayFox

0

Следующая функция:

inspect_files() { 
    find "$1/" -type f -maxdepth 1 -print0 | grep -zc . 
} 

возвращение на равнину количество файлов в заданном direcotry, е, г:

tmpcount=$(inspect_files /tmp) 
echo "File count in /tmp is: $tmpcount" 

если вы хотите считать все (а не только обычные файлы) использовать simlper :

inspect_files() { 
    find "$1/" -maxdepth 1 -print0 | grep -zc . 
} 

слэш после "$1/" убедитесь, что вы подсчета в каталогах, что являются символическим ссылки, такие как

$ ls -ld /tmp 
[email protected] 1 root wheel 11 27 jul 2012 /tmp -> private/tmp 
+1

Найти - это команда, которую мне нужно использовать больше, похоже, что она действительно уменьшает всю идею прохода по каталогу. Я прочитаю страницы man немного больше по этой команде, спасибо за ответ, как хорошо! – theGrayFox

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