如何在使用 find 时排除目录

如何在使用 find 时排除目录

我正在尝试使用 Unix 中的 find 命令,并且知道如何使用它的基本功能。例如,我有四个文件夹,A、B、C 和 D。每个文件夹下都有一个名为 的文件hi.dat。要查找所有文件夹,我会这样做:

find * -name hi.dat

太棒了!但是现在如果我这样做了怎么办?不是想查看文件夹 D?我可以尝试以下方法吗:

find * not D/* -name hi.dat

我不想输入:

find A/* B/* C/* -name ...因为我显然有三个以上的文件夹,而这些只是用作示例。

谢谢!Amit

答案1

在 Bash 中:

shopt -s extglob
find !(D) -name hi.dat

Ksh 和 zsh 的工作方式类似。

答案2

确实可以-prune— — 但这里有一个小技巧:

$ find . \( -name D -prune \) -o -name hi.dat

-prune表示“不要在这条路径上再进一步查看”,因此您需要另一个除D. 之外的目录的分支(-o表示“或”)。要跳过其他路径:

$ find . \( \( -name D -o -name Dminor \) -prune \) -o -name hi.dat

答案3

更通用的 find 命令是

find -path ./D -prune -o -name hi.dat -print

警告:该-path测试可能尚未可移植/不是 POSIX 标准的一部分。

基本原理:在类似以下的目录结构中

$ find
.
./D
./A
./A/D
./A/D/hi.dat

相比

$ find . \( -name D -prune \) -o -name hi.dat
./D
./A/D

它将仅列出实际搜索的文件(显式-print),并且不会忽略也名为 D 的子目录中的文件(-path):

$ find -path ./D -prune -o -name hi.dat -print
./A/D/hi.dat

答案4

它通过管道 grep -v 起作用,

$ find / -name "*~"|grep -v "/media"

到处都找,但没有在媒体目录中

相关内容