如何找到与 .gitignore 等模式对应的所有文件

如何找到与 .gitignore 等模式对应的所有文件

例如。我有一个像.myignore.在该文件中,我有如下字符串:

.vs/
*.suo
*.user
*.log

然后我想找到与 file 中的模式匹配的所有文件.myignore

答案1

zsh

() {print -rC1 -- ${(u)@}} ${~^${(f)"$(<.gitignore)"}}(ND)

在哪里:

  • () {body} args是带有参数的匿名函数调用
  • print -rC1 -- ${(u)@}作为函数的主体,在列上print显示其独特的参数(标志删除重复项)。如果您想删除这些文件/目录,请替换为。r1 Cuuprint -rC1rm -rf
  • "$(<.gitignore)".gitignore扩展为减去尾随换行符(如果有)的内容。引号是为了防止 IFS 分裂。
  • ${(f)param}将参数扩展拆分为行数f(也称为换行符)。
  • ${~param}允许对结果单词进行通配
  • ${^array}text以类似 rc 或类似鱼的方式扩展数组,其中 if $arraycontains AB例如,扩展为Atext Btext而不是A Btext.
  • (ND)添加[N]ullglob[D]otglob限定符,这样隐藏文件就不会被跳过,失败的匹配也不会导致错误。

答案2

使用设置为换行符的数组IFS

# save IFS variable
OLD_IFS=$IFS

# Set IFS to newline only
IFS=$'\n'

# Expand the files to an array.
files=($(<.myignore))

# reset IFS to old value
IFS=$OLD_IFS

# delete your files (remove the echo if the output is ok)
# ... or do other stuff
echo rm -f "${files[@]}"

答案3

您可以简单地通过命令替换来允许 shell 扩展:

echo $(cat .myignore)
ls -ld $(cat .myignore)
rm -rf $(cat .myignore)

相关内容