繁体   English   中英

递归查找所有不在排除文件中的文件

[英]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.jsdirectory/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM