创建包含隐藏文件的文件计数器

创建包含隐藏文件的文件计数器

作为编程作业的一部分,我需要创建一段代码来递归地计算文件和目录(包括隐藏)的数量。我不被允许使用命令-Rfinddu

我明白我可以使用:

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

像冠军一样工作!

相关内容