列出下一级不包含某个文件的子目录

use*_*711 7 linux

如何在目录(仅向下一级)中找到不包含给定文件的所有子目录?

Den*_*nis 5

有几种方法可以使用find完成此操作。

方法 1 不那么笨拙并且可以很好地处理奇怪的目录名称(例如,包含换行符的目录名称),但是如果有很多目录,方法 2 应该更快。

方法一

命令

find DIR -type d -mindepth 1 -maxdepth 1 -not -exec test -f {}/FILENAME \; \
    -print | sort
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • find DIR -type d -mindepth 1 -maxdepth 1-type dDIR 中查找所有目录 ( ) ,深度为 1。

  • -not -exec test -f {}/FILENAME \;当且仅当在当前处理的目录 ( ) 中找不到名为FILENAME的文件时才为真{}

  • -print 将输出所需的目录名称。

  • 如果需要,sort将按字母顺序对输出进行排序。

方法二

命令

( find DIR -type f -mindepth 2 -maxdepth 2 -name FILENAME -printf "%h\n" ; \
    find DIR -type d -mindepth 1 -maxdepth 1 ) | sort | uniq -u
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • find DIR -type f -mindepth 2 -maxdepth 2 -name FILENAMEDIR的子目录中查找所有-type f名为FILENAME 的文件 ( ) (深度为 1 的目录的文件具有深度为 2)。

  • -print "%h\n"打印包含名为FILENAME 的文件的目录的名称,后跟换行符。

  • find DIR -type d -mindepth 1 -maxdepth 1列出DIR中的所有目录 ( -type d) ,深度为 1。

  • sort按字母顺序对输出进行排序(输出到 时必须排序uniq)。

  • uniq -u 只打印独特的线条。

    DIR 的每个子目录至少被列出一次,但那些包含名为FILENAME的文件被列出两次。uniq -u消除了后一种。