![如何在使用 find 时排除目录](https://linux22.com/image/1268966/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%BD%BF%E7%94%A8%20find%20%E6%97%B6%E6%8E%92%E9%99%A4%E7%9B%AE%E5%BD%95.png)
我正在尝试使用 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"
到处都找,但没有在媒体目录中