在Bash中,是否有一种方法可以指定“find”命令中排除项的异常情况?

3
我想在一个目录及其子目录中找到所有文件,但不包括任何设置文件和任何位于设置或依赖目录中的文件。
例如,我希望从结果中排除整个目录,如.git、.idea 和 node_modules,以及像.DS_Store 和 config.codekit 这样的文件,但我想包括.gitignore。
我所需的是类似以下 Git 命令的结果,但包括任何未跟踪的文件,并且可以轻松安全地操作(例如更改权限)。
git ls-tree -r master --name-only

以下是我目前的代码,虽然有些臃肿,但它似乎基本实现了我的目标,除了忽略 .gitignore 文件:

find . -type f -not -name ".*" -not -name config.codekit -not -path "./.*" -not -path "./node_modules/*"

我尝试过使用-prune,但并没有取得太大的成功。

在Bash中,是否有一种指定排除项的例外情况的方法,比如说排除所有与此模式匹配的内容,除了这个或这些

顺便说一下,我目前正在使用OS X,但我也使用Ubuntu,并计划在Windows 10周年更新普及后尝试在Windows上使用Ubuntu,因此理想情况下,我希望有一个可在所有这些操作系统上运行的命令。

提前感谢您提供任何解决方案、见解或优化!

更新

感谢gniourf-gniourf的帮助,我已经修改了我的命令。这似乎实现了我想要的功能:

find . -type f \( \! -name ".*" \! -name config.codekit \! -path "./.*" \! -path "./node_modules/*" -o -name .gitignore \)
1个回答

3

首先是一个快速的例子:查找所有文件,修剪掉.git目录并忽略.DS_Store文件:

find . -name .git -type d \! -prune -o \! -name .DS_Store -type f

例如,我希望从结果中排除整个目录,比如 .git.ideanode_modules,以及文件如 .DS_Storeconfig.codekit,但是我想要包括 .gitignore
find . \( -name .git -o -name .idea -o -name node_modules \) -type d \! -prune -o \! -name .DS_Store \! -name config.codekit -type f

构建命令时,请确保遵循POSIX标准:这可以保证您的命令在任何(符合POSIX标准的)系统上都能正常工作。例如,-not不符合POSIX标准:请改用!代替(您需要对其进行转义,以免与shell历史扩展发生冲突)。

有没有一种方法可以通过Bash在find命令中指定例外项-比如说排除所有匹配此模式的内容,但是保留这个或这些文件?

查找文件,排除所有内容(模式*),除了文件onetwo

find . \( \! -name '*' -o -name one -o -name two \) -type f

太好了。这很有帮助。谢谢你。分组、排除和或运算符可能很难理解。考虑到所有这些,以下代码似乎可以满足我的需求:find . -type f \( \! -name ".*" \! -name config.codekit \! -path "./.*" \! -path "./node_modules/*" -o -name .gitignore \) - Brian Sexton
看起来在这种情况下我不需要那些括号,所以这里有一个小修订:find . -type f \! -name ".*" \! -name config.codekit \! -path "./.*" \! -path "./node_modules/*" -o -name .gitignore - Brian Sexton
@BrianSexton:由于-o的存在,-type f谓词不会应用于-name .gitignore谓词,因此您还将匹配.gitignore_目录_。 - gniourf_gniourf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接