查找仅包含隐藏文件和/或隐藏目录的所有目录

如何解决查找仅包含隐藏文件和/或隐藏目录的所有目录

问题

  • 我一直在努力编写一个 Bash 命令,该命令能够递归搜索目录,然后返回包含独占隐藏的每个子目录的路径(达到某个最大深度文件和/或隐藏目录。

视觉说明

  • 考虑以下文件系统摘录:
+--- Root_Dir
|   +--- Dir_A
|   |   +--- abc.txt
|   |   +--- 123.txt
|   |   +--- .hiddenfile
|   |   +--- .hidden_dir
|   |   |   +--- normal_sub_file_1.txt
|   |   |   +--- .hidden_sub_file_1.txt
|   |     
|   +--- Dir_B
|   |   +--- abc.txt
|   |   +--- .hidden_dir
|   |   |   +--- normal_sub_file_2.txt
|   |   |   +--- .hidden_sub_file_2.txt
|   |    
|   +--- Dir_C
|   |   +--- 123.txt
|   |   +--- program.c
|   |   +--- a.out
|   |   +--- .hiddenfile
|   |   
|   +--- Dir_D
|   |   +--- .hiddenfile
|   |   +--- .another_hiddenfile
|   |     
|   +--- Dir_E
|   |   +--- .hiddenfile
|   |   +--- .hidden_dir
|   |   |   +--- normal_sub_file_3.txt   # This is OK because its within a hidden directory,aka won't be checked
|   |   |   +--- .hidden_sub_file_3.txt
|   | 
|   +--- Dir_F
|   |   +--- .hidden_dir
|   |   |   +--- normal_sub_file_4.txt
|   |   |   +--- .hidden_sub_file_4.txt

期望输出

  • 我正在寻找的命令会输出
    ./Root_Dir/Dir_D
    ./Root_Dir/Dir_E
    ./Root_Dir/Dir_F
    
    • Dir_D 因为它只包含隐藏文件
    • Dir_E 因为它只包含我正在搜索的级别的隐藏文件和隐藏目录。
    • Dir_F 因为它只包含我正在搜索的级别的隐藏目录。

尝试

  • 我尝试使用 find 命令来获取我正在寻找的结果,但我似乎无法弄清楚我需要将输出传输到哪个其他命令或我应该使用哪些其他选项.
  • 我认为可以运行的命令如下所示:
    $ find ./Root_Dir -mindepth 2 -maxdepth 2 -type d -name "*." -type -f -name "*." | command to see if these are the only files in that directory  
    

解决方法

假设采用这种结构,则不需要 find
根据需要调整您的模式。

for d in $ROOT_DIR/Dir_?/; do
  lst=( $d* );  [[ -e "${lst[0]}" ]] && continue # normal files,skip
  lst=( $d.* ); [[ -e "${lst[2]}" ]] || continue # NO hidden,so skip
  echo "$d"
done

我在我的 /tmp 目录中重建了您的文件结构并将其保存为 tst,所以

$: ROOT_DIR=/tmp ./tst
/tmp/Dir_D/
/tmp/Dir_E/
/tmp/Dir_F/

注意隐藏文件的确认使用"${lst[2]}",因为前2个永远是...,这两个不算。

您可能可以使用 for d in $ROOT_DIR/*/
我怀疑这对你有用。 (mindepth=2,maxdepth=2)

如果您需要更深的子目录(mindepth=3,maxdepth=3),您可以添加一个级别 -

for d in $ROOT_DIR/*/*/

和/或两者(mindepth=2,maxdepth=3)

for d in $ROOT_DIR/*/ $ROOT_DIR/*/*/

或者如果您想要最小深度/最大深度,

shopt -s globstar
for d in $ROOT_DIR/**/
,

解析find的输出不是一个好主意; -exec 存在,sh 可以在不破坏任何内容的情况下进行过滤。

find . -type d -exec sh -c '
for d; do
  for f in "$d"/*; do
    test -e "$f" &&
      continue 2
  done
  for f in "$d"/.[!.]* "$d"/..?*; do
    if test -e "$f"; then
      printf %s\\n "$d"
      break
    fi
  done
done' sh {} +

您可以使用find为其提供的任何扩展来调整深度。

,

如果您的文件名不包含换行符,这将起作用。

find -name '.*' | awk -F/ -v OFS=/ '{ --NF } !a[$0]++'

学习 awk:https://www.gnu.org/software/gawk/manual/gawk.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?