查找具有目录路径的文件排除子目录

查找具有目录路径的文件排除子目录

如何使用它find来遍历目录,但不递归到其子目录?

我尝试过-prune,但不起作用。没有-maxdepth选择。

find /opt/projectname/bin -type f /opt/projectname/bin -prune -o -print
find: missing conjunction
/opt/projectname/bin/file_1_is_printed
/opt/projectname/bin/file_2_is_printed
/opt/projectname/bin/directory_within_bin/some_file_should_not_be_printed
/opt/projectname/bin/directory_2_within_bin/some_file_2_should_not_be_printed

/usr/bin/find:
         find.c $Date: 2011/08/12 15:04:36 $Revision: r11.31/4 PATCH_11.31 (PHCO_42158)
         libcpio.c $Date: 2008/05/27 16:08:10 $Revision: r11.31/2 PATCH_11.31 (PHCO_36666)
         $Revision: @(#) find R11.31_BL2011_0923_2 PATCH_11.31 PHCO_42158

这个问题不是重复的问题。这里没有 GNU。尽管这个问题可能是重复的问题,但这些问题的答案都要求安装 GNU 工具。因此,如果这里的答案有助于解决,那么这是一个独特的线程。

答案1

假设find问题中的命令实际上是您键入的内容,则您将操作与目录搜索根混合在一起,从而导致错误消息。

我的建议基于此 HP UX 手册页find,这与你的“-maxdepth“ 陈述。

试试这个变体:

find /opt/projectname/bin -path '/opt/projectname/bin/*/*' -prune -o -type f -print

如果我知道目录中没有“太多”文件,我实际上会考虑这种“更干净”的替代方案,但在您的情况下,您可能无法接受:

find /opt/projectname/bin/* -type f -print -o -prune

答案2

错误“缺少连词”是因为您在 后面重复了目录名称-type f,并且find不知道如何解析它。

为了避免遍历子目录,您需要修剪目录,而不是常规文件。但是,您不能修剪起始目录,否则find除了它之外什么也不处理。识别起始目录的一个简单方法是将其名称安排为.

find /opt/projectname/bin/. -name . -o -type d -prune -o -print

解释:

  • -name .— 如果名称是.,[不执行任何操作]
  • 否则:-type d— 如果文件是目录,则不要进入其中
  • 否则:打印路径

答案3

今天我一直在努力解决这个问题,并且进行了大量的调查和测试,但我想出了一个解决方案不是要求您指定需要忽略的每个单独的子目录笔记在下文中,dir-name .。)

$ find  dir-name/*  -name file-name  -print  -o -prune

如果您需要查找.文件,例如.login,那么命令应该是...

$ find  dir-name/.*  -name .file-name  -print  -o -prune

如果您需要执行-exec某些操作,例如删除找到的文件,那么这个 for-do 循环似乎是必要的:

$ for  FILE  in  $( find  dir-name/*  -name file-name  -print  -o -prune )
do
    echo  "Removing  $FILE"
    rm  -f  $FILE
done

:这是专门针对 HP-UX-11.31 中的 Korn-shell 的

Linux 中不需要它,Linux 具有更简单的语法来避免子目录。除了 HP-UX 之外,这也可能适用于非 Linux 的其他 Nix 变体,但我只测试了 HP-UX。

答案4

您在这里需要的更多的是 GNU -mindepth 1 -maxdepth 1(而且通常是不需要的),以及标准的等价物:

find /path/to/dir -mindepth 1 -maxdepth 1 ...

实际上更短:

find /path/to/dir/. ! -name . -prune ...

在这里,我们修剪除了树的根之外的任何东西,并且我们同时排除该树的根,因为 为! -name .false .,因此只要-o不使用,就会跳过剩余的部分。

三点注意:

  1. 如果是符号链接,则它们不等效,/path/to/dir在这种情况下,第二个更像是-H传递了选项,而第一个仅停在链接处。
  2. 文件的路径将/path/to/dir/./file/within代替/path/to/dir/file/within.
  3. 正如上面所暗示的,你需要小心-o。例如find /path/to/dir/. ! -name . -prune -type l -o -type d将被解释为find /path/to/dir/. '(' ! -name . -prune -type l ')' -o -type d因此 print /path/to/dir/.(所以不是-mindepth 1)。您想编写它:find /path/to/dir/. ! -name . -prune '(' -type l -o -type d ')'仅报告/path/to/dir.

find如今,大多数实现都支持-path最初来自 BSD 并最终由 POSIX 指定的谓词,因此您可以使用以下方法解决前两点:

find /path/to/dir ! -path /path/to/dir -prune ...

但请记住 的参数-path被视为一种模式,因此它可以用于任意目录路径,例如:

找到“$dir”! -路径“$dir”-修剪...

更一般地说,对于 GNU 的标准等效项-maxdepth n,请参见将 POSIX 查找限制到特定深度?

相关内容