[英]Find all files recursively which are not in an exclude file
我想从具有模式且不在.ignore
文件中的目录中获取所有文件。
我试过这个命令:
find . -name '*.js' | grep -Fxv .ignore
但find
输出类似于./directory/file.js
并且我的.ignore
的格式如下:
*.min.js
directory/directory2/*
directory/file_56.js
所以grep不匹配任何......
有没有人知道如何做到这一点/线索?
更新所以我发现了一些东西,但它并不完全有效:
find . -name '*.js' -type f $(printf "! -name %s " $(cat .ignore | sed 's/\//\\/g')) | # keeps the path
sed 's/^\.\///' | # deleting './'
grep -Fxvf .ignore
它适用于(未显示) *.min.js
和directory/file_56.js
但不适用于directory/directory2/*
看起来您正在寻找 Git 的.gitignore
文件支持的功能子集:
args=()
while read -r pattern; do
[[ ${#args[@]} -gt 0 ]] && args+=( '-o' )
[[ $pattern == */* ]] && args+=( -path "./$pattern" ) || args+=( -name "$pattern" )
done < .ignore
find . -name '*.js' ! \( "${args[@]}" \)
find
的排除测试首先在 Bash 数组中构建,这允许应用特定于行的逻辑:
请注意如何使用-path
或-name
测试,这取决于.ignore
手头的模式是否包含至少一个/
:
-path
测试的模式以./
为前缀,以匹配find
输出的路径。-name
模式保持原样; *.min.js
模式将匹配子树中的任何位置。 使用您的示例.ignore
文件,上述结果会生成以下find
命令:
find . -name '*.js' ! \( \
-name '*.min.js' -o -path './directory/directory2/*' -o -path './directory/file_56.js' \
\)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.