我有以下文件夹结构:
example/
├── bar/
│ ├── 1
│ ├── 2
│ ├── 3
│ ├── 4
│ ├── 5.txt
│ ├── bar.mylib/
│ │ ├── 1
│ │ ├── 2
│ │ ├── 3
│ │ ├── 4
│ │ ├── 5
│ │ ├── 6
│ │ └── foo/
│ │ ├── 1
│ │ ├── 3
│ │ └── 5
│ └── foo.mylib
└── foo/
├── 1
├── 3
├── 5
└── node_modules/
├── 1
├── 2
├── 3
├── 4
└── 5
5 directories, 23 files
我想构建一个find
命令来列出所有文件和目录,但排除特定的目录名称模式,根本不输入这些目录,但仍然在输出中包含目录名称。
预期输出如下:
example/
example/foo/
example/foo/3
example/foo/5
example/foo/1
example/foo/node_modules/
example/bar/
example/bar/5.txt
example/bar/3
example/bar/4
example/bar/1
example/bar/bar.mylib/
example/bar/foo.mylib
example/bar/2
我尝试了以下方法:
find . -type f ! -path '*/*.mylib/*' ! -path '*/node_modules/*'
这样的作品,但它似乎进入了那些被忽略的目录。此外,它没有列出被忽略的目录(即example/foo/node_modules/
和example/bar/bar.mylib/
)。
我故意有两个.mylib
路径:一个是目录,另一个是文件。我想列出两者,但忽略目录的内容。
我们怎样才能做到这一点find
?
答案1
策略是修剪所有与您的node_modules
或匹配的目录*.mylib
(修剪意味着不进入其中)并打印所有其他文件。
find . -print \( -type d \( -name 'node_modules' -o -name '*.mylib' \) -prune \)
咨询查找规格或手册(如果上述任何选项对您来说不熟悉)。