「cat」、「dog」、またはその両方のラベルが別々の行に含まれるテキストファイルを含む「labels」というディレクトリがあります。
labels ディレクトリのファイル内容は次のとおりです。
cat labels/1.txt
cat
cat labels/2.txt
dog
cat labels/3.txt
cat
dog
「cat」タグのみを含むファイル名を取得したいです。次のコマンドを試しました。
ls labels | grep -Rwl "cat"
labels/1.txt
labels/3.txt
ただし、このコマンドは「cat」またはその両方を含むファイル名を返します。しかし、私の要件は、「cat」だけを含み、「cat」と「dog」の両方を含まないファイル名を取得することです。
同様に、「dog」のみを含むファイル名を取得しようとする場合も同様です。同じ方法で検索すると、「dog」または両方のタグを含むファイル名が返されます。
ls labels | grep -Rwl "dog"
labels/2.txt
labels/3.txt
ベストアンサー1
2回使用できますgrep
。 a)を含むすべてのファイルを一覧表示し、cat
b)埋め込みdog
ファイルをフィルタリングして除外します。一致するファイル名と一致しないファイル名を一覧表示し、それぞれを-l
使用します。-L
-l
-L
grep -L 'dog' $(grep -l 'cat' <list of files>)
バラよりman grep
:
-L, --file が一致しません。
通常の出力を抑制します。代わりに、通常は印刷されない各入力ファイルの名前を印刷します。検索は最初の一致で停止します。
-l、--一致するファイルを含む
通常の出力を抑制します。代わりに、印刷は通常、各入力ファイルの名前を印刷します。検索は最初の一致で停止します。