从find命令修剪目录并附加`/`

时间:2019-02-14 20:38:52

标签: bash shell

我正在使用以下命令查找除符号链接之外的所有文件和目录,并仅在目录末尾附加尾随/

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目录,但还在文件末尾附加了/。之前只有目录附加了/。请问语法有什么问题?

1 个答案:

答案 0 :(得分:1)

我们如何使其发挥作用?

在输入“或”的任何一侧以使其同时应用于两者之前进行修剪,并且在其之前没有放置其他任何过滤器(全局配置-mindepthmaxdepth除外):< / 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