1

我试图让我的函数 inspect_files 保持单一职责的原则,我知道我可以轻松地计算该函数内部的文件数并在那里打印,但是还有比这更优雅的文件计数解决方案吗?

(注意,我不想要递归文件计数。)

# 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
4

2 回答 2

1

下一个功能:

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

返回给定目录中的普通文件计数,例如:

 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
lrwxr-xr-x@ 1 root  wheel  11 27 jul  2012 /tmp -> private/tmp
于 2013-07-28T21:56:54.430 回答
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,这对于隔离来说要好得多。

于 2013-07-28T21:55:06.327 回答