我正在使用以下命令查找除符号链接之外的所有文件和目录,并仅在目录末尾附加尾随/
:
find $METADATA_PATH/home/db2inst1/sqllib/ -maxdepth 1 -mindepth 1 ! -type l '(' '(' -type d -printf '%p/\n' ')' -o -print ')'
我想排除目录之一,所以我这样做了:
find $METADATA_PATH/home/db2inst1/sqllib/ -maxdepth 1 -mindepth 1 ! -type l '(' '(' -type d '(' -path $METADATA_PATH/home/db2inst1/sqllib/db2dump ')' -prune -o -printf '%p/\n' ')' -o -print ')'
这确实从输出中排除了db2dump目录,但还在文件末尾附加了/
。之前只有目录附加了/
。请问语法有什么问题?
答案 0 :(得分:1)
在输入“或”的任何一侧以使其同时应用于两者之前进行修剪,并且在其之前没有放置其他任何过滤器(全局配置-mindepth
和maxdepth
除外):< / p>
find "$METADATA_PATH/home/db2inst1/sqllib/" -maxdepth 1 -mindepth 1 \
-path "$METADATA_PATH/home/db2inst1/sqllib/db2dump" -prune -o \
'(' ! -type l '(' -type d -printf '%p/\n' ')' -o -print ')'
在这里,我们先输入-prune
,然后再输入条件的任一边 ,在该条件的左侧您需要-printf '%p/'
,在左侧要-print
是的。
坦率地说,原始代码的逻辑嵌套让人难以理解。为了使它有意义,我最终构建了一个带有适当缩进的版本:
find $METADATA_PATH/home/db2inst1/sqllib/ -maxdepth 1 -mindepth 1 \
! -type l '(' \
'(' \
-type d \
'(' \
-path $METADATA_PATH/home/db2inst1/sqllib/db2dump \
')' \
-prune \
-o -printf '%p/\n' \
')' \
-o -print \
')'
在-type d
进入-path
之前,您的-prune
情况如何?您正在将 both 都设为“ {or}”左侧的-type d
和-path
的一部分,而其右侧为-printf '%p/\n'
。因此,每当-type d
为假时,您就会掉入-or
并到达-printf
。