作为编程作业的一部分,我需要创建一段代码来递归地计算文件和目录(包括隐藏)的数量。我不被允许使用命令-R
、find
或du
。
我明白我可以使用:
listAllFiles() {
local dir=$1
local file
directoryCounter=0
fileCounter=0
hiddenFileCounter=0
hiddenDirectoryCounter=0
for file in "$dir"/*; do
if [[ -d $file ]]; then
listAllFiles "$file"
directoryCounter+=1
else if [[ -f $file ]]
fileCounter+=1
else if [[hidden directory]]
hiddenDirectoryCounter+=1
else if [[hiddenfile]]
hiddenFileCounter+=1
fi
done}
有没有办法让我在此 else if 语句中包含隐藏文件和目录。
答案1
最简单的方法bash
是运行shopt -s dotglob
,它会告诉bash
您在 glob 中包含隐藏文件。
如果您不想这样做(例如使用没有该功能的 shell),您可以只使用以下 glob: .[!.]* ..?* *
。明显的复杂性是避免匹配.
和..
。第一个 glob 匹配以 开头.
但不是 的2 个字符或更长的隐藏文件..
。第二个匹配以 . 开头的 3 个字符或更长的隐藏文件..
。最后一个是非隐藏文件的普通 glob。
有没有办法让我在此 else if 语句中包含隐藏文件和目录。
实际上,这是for
您应该查看的声明。您需要做的就是更改"$dir"/*
为包含我上面描述的其他 2 个全局模式。
答案2
你可以这样:
shopt -s nullglob
n=0
count() {
for i in "$1"/* "$1"/.*; do
if [ "${i##*/}" = . ] || [ "${i##*/}" = .. ] || [ -L "$i" ] || [ ! -d "$i" ]; then
n=$(($n + 1))
else
count "$i"
fi
done
}
count .; echo "$n"
唯一的巴什主义就是shopt
上面的命令。它不会像find
以前那样检测文件系统循环,但至少它不遵循符号链接。
答案3
这并不是严格意义上的编程,而是:
$ i=$(ls -al | wc -l); echo $i - 3 | bc
像冠军一样工作!