例えば。のようなファイルがあります.myignore
。そのファイルには次の文字列があります。
.vs/
*.suo
*.user
*.log
次に、ファイルのパターンに一致するすべてのファイルを見つけたいと思います.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やfishと同じ方法で配列を拡張します。たとえば、が$array
含まれている場合は代わりに展開されます。A
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
単にコマンドの置き換えによってシェル拡張を許可することができます。
echo $(cat .myignore)
ls -ld $(cat .myignore)
rm -rf $(cat .myignore)