我试图让我的函数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
字符串
3条答案
按热度按时间wsewodh21#
关于:
字符串
这个名称更准确地描述了原始函数的功能。请注意,要分析的目录作为参数传递给函数,但如果不传递任何内容,则默认为
.
(当前目录)。这将函数与变量$dir_name
解耦,这对于隔离来说要好得多。ghhaqwfi2#
下一个功能:
字符串
返回给定目录中的普通文件计数,例如:
型
如果您想计算所有内容(不仅仅是普通文件),请使用simlper:
型
"$1/"
后面的斜杠确保您在目录中计算符号链接,如型
lkaoscv73#
我认为一个更优雅和性能更好的计算文件的解决方案可以是这个:
字符串
所以你的计数函数看起来像这样:
型
这个版本的工作原理是为目录中的每个项目打印一个“x”,然后用wc -m计算字符数。它具有非常低的内存占用,不进行排序,并且您可以将输出重定向到一个文件进行异步计数-对于非常大的目录-(旁注:这也会计算隐藏文件和子目录,所以你最终必须用
-and -not -name '.*'
过滤掉它们。提示:
-ignore_readdir_race
使find
忽略操作过程中由于删除文件而导致的错误(可能您不想在计数过程中停止对目录中文件的操作)。关于使用bash计算文件有很多问题,所以我想使用一个函数(就像你做的那样)来简化操作会很有帮助。我将复制您的方法并将其放入我的.barshrc和.zshrc中;- )