识别文件或目录是否隐藏

识别文件或目录是否隐藏

我正在尝试编写一个bash脚本,递归地打印出目录中的所有文件(包括隐藏文件),并记录文件、隐藏文件、隐藏目录和目录的数量。这是作业的一部分,我不允许使用-Rorfinddu

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
  elif [[ -f $file ]];then
      fileCounter+=1]
      ls -l $file
  elif [[file is a hidden directory]];then
      listAllFile "$file"
      hiddenDirectoryCounter+=1
  elif [[file is a hidden file]];then
      hiddenFileCounter+=1
      ls -l $file
  fi
     done
 }

有没有办法检测文件/目录是否被隐藏

答案1

隐藏文件和目录的名称以 开头.,因此您可以在 Bash 中使用以下解决方案:

# Skip '.' and '..':
if [ "$file_name" = . ] || [ "$file_name" = .. ];then
    continue
fi
# Find hidden files:
if [[ "$file_name" =~ ^\. ]];then # if file name starts with a .
...

答案2

Unix 本机文件系统上没有隐藏文件或目录,至少不是基于文件系统元数据中分配的某些属性。

自定义的是,某些命令(如 、ls)默认情况下不显示名称以“ ”开头的文件/目录.。其他工具(例如 nautilus)遵循此约定。如果你看一下它的手册页,ls并没有写到隐藏文件:

-a, --all
     do not ignore entries starting with .

根据维基百科这种行为是 Unix 早期的软件错误造成的。

其他工具,例如find将始终显示被ls.

在 Windows 文件系统上,存在基于属性的隐藏文件,请参见例如问题。

我怀疑你的部分作业是一个棘手的问题,因为人们经常将隐藏行为误认为ls存在隐藏文件。

答案3

find /directory_path -type f | wc -l会给你文件的数量

find /directory_path -type d | wc -l会给你目录的数量

相关内容