linux 使用Bash计算文件数

wqlqzqxt  于 2023-08-03  发布在  Linux
关注(0)|答案(3)|浏览(114)

我试图让我的函数inspect_files遵循单一责任的原则,我知道我可以很容易地计算该函数内部的文件计数并将其打印出来,但是否有比这更优雅的解决方案来计数文件?
(Note,我不需要递归的文件计数。)

# 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

字符串

wsewodh2

wsewodh21#

关于:

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解耦,这对于隔离来说要好得多。

ghhaqwfi

ghhaqwfi2#

下一个功能:

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

lkaoscv7

lkaoscv73#

我认为一个更优雅和性能更好的计算文件的解决方案可以是这个:

find "$dir_name" -mindepth 1 -maxdepth 1 -ignore_readdir_race -printf x | wc -m

字符串
所以你的计数函数看起来像这样:

count_files() {
  local count
  local dir="$1"
  count=$(find "$dir_name" -mindepth 1 -maxdepth 1 -ignore_readdir_race -printf x | wc -m)
  printf "\nTotal: %d\n" "$count"
}


这个版本的工作原理是为目录中的每个项目打印一个“x”,然后用wc -m计算字符数。它具有非常低的内存占用,不进行排序,并且您可以将输出重定向到一个文件进行异步计数-对于非常大的目录-(旁注:这也会计算隐藏文件和子目录,所以你最终必须用-and -not -name '.*'过滤掉它们。
提示:-ignore_readdir_race使find忽略操作过程中由于删除文件而导致的错误(可能您不想在计数过程中停止对目录中文件的操作)。
关于使用bash计算文件有很多问题,所以我想使用一个函数(就像你做的那样)来简化操作会很有帮助。我将复制您的方法并将其放入我的.barshrc和.zshrc中;- )

相关问题