例如。我有一个像.myignore
.在该文件中,我有如下字符串:
.vs/
*.suo
*.user
*.log
然后我想找到与 file 中的模式匹配的所有文件.myignore
。
答案1
在zsh
:
() {print -rC1 -- ${(u)@}} ${~^${(f)"$(<.gitignore)"}}(ND)
在哪里:
() {body} args
是带有参数的匿名函数调用print -rC1 -- ${(u)@}
作为函数的主体,在列上print
显示其独特的参数(标志删除重复项)。如果您想删除这些文件/目录,请替换为。r
1
C
u
u
print -rC1
rm -rf
"$(<.gitignore)"
.gitignore
扩展为减去尾随换行符(如果有)的内容。引号是为了防止 IFS 分裂。${(f)param}
将参数扩展拆分为行数f
(也称为换行符)。${~param}
允许对结果单词进行通配${^array}text
以类似 rc 或类似鱼的方式扩展数组,其中 if$array
containsA
,B
例如,扩展为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)