从查找中排除所有子目录

从查找中排除所有子目录

我想查看文件夹中的某些文件,但不想查看任何子目录。

我不想排除目录,但是全部

我试过这个

find "$dir" -name '*.out' -type d -prune

但结果就是结果什么都没有。有什么帮助吗?

答案1

完成该任务的最简单方法(在不包括所有子目录的文件夹中查找文件)是

find $dir -maxdepth 1 -type f -name '*.out' -o '.*.out'

正如 @StevenPenny 和 @RalfFriedlal 所写, maxdepth 选项就是您正在寻找的。

来自查找手册: -max深度级别 下降到起始点以下目录的大多数级别(非负整数)级别。 -maxdepth 0 表示仅将测试和操作应用于起点本身。

-type f :您正在搜索常规文件 -name '*.out' -o '.*.out' :-o 表示或,并允许您在搜索中包含扩展名为 .out 的最终隐藏文件。

对不起,我的英语不好 :(

答案2

你尝试看一下手册吗?

您正在寻找的选项是-maxdepth,正如 @StevenPenny 已经写的那样。

结果一无所获的原因之一是(来自手册)

如果整个表达式不包含除 -prune 或 -print 之外的任何操作,则对整个表达式为 true 的所有文件执行 -print。

因此,正如您的选择所包括的那样-prune,没有任何隐含的-print。您的命令只会删除名为 的目录*.out

如果您确实想使用-prune,请执行以下操作:

find "$dir"/* -type d -prune -o -name '*.out' -print

请注意,这使用"$dir"/*,因为"$dir"是一个目录并且会被修剪。这抵消了find不受最大参数长度限制的优点

答案3

看起来好像你实际上根本不需要find这里。

for pathname in "$dir"/*.out; do
    [ ! -f "$pathname" ] && continue

    # do whatever you need to do to "$pathname" here
done

测试后-f"$pathname"将指向一个常规文件或一个到常规文件的符号链接。请注意,隐藏文件将被跳过,因为*与以点开头的文件名不匹配(除非dotglob在 中设置了 shell 选项bash,您可能会或可能不会使用该选项)。

find

find "$dir" -mindepth 1 -type d -prune -o -type f -name '*.out' -print

-mindepth 1会导致起始目录不被 修剪-type d -prune。应该-print替换为您想要对找到的路径名执行的操作(这将是名称以 结尾的常规文件.out)。

或者,

find "$dir" ! -path "$dir" -type d -prune -o -type f -name '*.out' -print

这仅使用标准find选项并修剪所有与起始路径不同的目录。

或者,

find "$dir" -maxdepth 1 -type f -name '*.out' -print

-maxdepth 1更简单地说,使用将停止find下降到起始目录的任何子目录。

-mindepth和选项-maxdepth虽然普遍可用,但它们是对标准find命令,如果您的实现find没有它们,则必须使用 shell 循环或仅find使用-prune(with -path) 的替代方案。

答案4

zsh

printf '%s\n' $dir/*.out(^/)  # files of any type except directory (excluding
                              # hidden ones)
printf '%s\n' $dir/*.out(-^/) # same but also excludes symlinks to directories
printf '%s\n' $dir/*.out(.)   # regular files only (excluding hidden ones)
printf '%s\n' $dir/*.out(-.)  # regular files or symlinks to regular files
                              # (excluding hidden ones)
printf '%s\n' $dir/*.out(D-.) # same, but include hidden ones.

相关内容