如何使用它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
不使用,就会跳过剩余的部分。
三点注意:
- 如果是符号链接,则它们不等效,
/path/to/dir
在这种情况下,第二个更像是-H
传递了选项,而第一个仅停在链接处。 - 文件的路径将
/path/to/dir/./file/within
代替/path/to/dir/file/within
. - 正如上面所暗示的,你需要小心
-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 查找限制到特定深度?。