ファイルのマッチングを処理するコンテンツを作成していますが、リバース操作が必要です。ファイルリスト(例:from find . -type f -print0 | sort -z >lst
)と一致リスト(例:from grep -z foo lst >matches
- 注)これは単なる例であり、任意のmatches
サブセット(空白または全体を含む)またはlst
)にすることができます。これを元に戻したいです。
背景:私は次のようなものを実装しています。検索(1)例外ファイルリスト(このリストは事前にフィルタリングできますが、呼び出し時にファイルシステムにファイルが存在します)ファイルリストがそれほど大きくない場合は使用できますが、自分find "${files[@]}" -maxdepth 0 -somecondition -print0
が書いている内容を適切に使用してもLinuxまたはBSDのargv
サイズ制限を超えます。 。
行がNULで区切られていない場合は、を使用できますcomm -23 lst matches >inverted
。一致がNULで区切られていない場合は、を使用できますgrep -Fvxzf matches lst
。ただし、最初の段落で述べたジェネレータでは両方です。
GNUツールがインストールされていると仮定すると、これはDebianの外部に移植する必要はありません。私が使っていて友達がすでに持っているからfind -print0
ですsort -z
。文句を言わないでください)。
ここでもコードを再利用しようとしています。comm -23
入力行の区切り文字の変更を(まだ)サポートしていないことを除いて、基本的にはすでに完璧なツールです。コミュニケーションそれにもかかわらず、過小評価され、よく知られていないツールです。 Unix / Linuxツールボックスが合理的な機能を提供していない場合は、シェルでcomm -23
フォームを再実装できます(このユースケースに合わせて単純化)。なぜなら、スクリプトはすでに(他の理由で)read -d ''
入力時にNUL区切り文字をサポートするシェルを必要とするからです。しかし、それは遅いでしょう(そしてそれは難しいです...明日または28日にいつそれを取るのか誰かを知りたいのですが、仕事の終わりにこの記事を投稿します)。
答え1
テキスト以外の入力をサポートしている場合comm
(GNUツールが通常行っているように)、常にNULとnlを置き換えることができます(ここではプロセス置換をサポートするシェルを使用します(btw、mkshにはどのような計画がありますか?)) 。
comm -23 <(tr '\0\n' '\n\0' < file1) <(tr '\0\n' '\n\0' < file2) |
tr '\0\n' '\n\0'
それは一般的に使用される技術。
答え2
-v
grepを使用して一致するものを検索する場合は、grepオプションを使用して一致しない行を見つけることができます。