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

时间:2017-01-12 08:59:54

标签: bash

我想从目录中获取所有具有模式且不在find文件中的文件。

我试过这个命令:

./directory/file.js

.ignore输出与*.min.js directory/directory2/* directory/file_56.js 类似,我的find . -name '*.js' -type f $(printf "! -name %s " $(cat .ignore | sed 's/\//\\/g')) | # keeps the path sed 's/^\.\///' | # deleting './' grep -Fxvf .ignore 格式如下:

*.min.js

所以grep不符合任何......

有没有人有关于如何做到这一点的想法/线索?

更新 所以我发现了一些东西,但它并没有完全发挥作用:

directory/file_56.js

directory/directory2/*mod_offline有效(不显示),ignore_pep_from_offline: true max_user_offline_messages: admin: 5000 all: 100 mod_offline: access_max_user_messages: max_user_offline_messages 无效

1 个答案:

答案 0 :(得分:2)

您好像正在寻找Git&#39 {s} .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' \
\)