.gitignoreのようなパターンに対応するすべてのファイルを見つける方法

.gitignoreのようなパターンに対応するすべてのファイルを見つける方法

例えば。のようなファイルがあります.myignore。そのファイルには次の文字列があります。

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

次に、ファイルのパターンに一致するすべてのファイルを見つけたいと思います.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}textrcやfishと同じ方法で配列を拡張します。たとえば、が$array含まれている場合は代わりに展開されます。ABAtext BtextA 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)

関連情報