我想查看文件夹中的某些文件,但不想查看任何子目录。
我不想排除目录,但是全部!
我试过这个从
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.