指定されたテキストのみを含むファイル名を取得する方法

指定されたテキストのみを含むファイル名を取得する方法

「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)を含むすべてのファイルを一覧表示し、catb)埋め込みdogファイルをフィルタリングして除外します。一致するファイル名と一致しないファイル名を一覧表示し、それぞれを-l使用します。-L-l-L

grep -L 'dog' $(grep -l 'cat' <list of files>)

バラよりman grep

-L, --file が一致しません。

通常の出力を抑制します。代わりに、通常は印刷されない各入力ファイルの名前を印刷します。検索は最初の一致で停止します。

-l、--一致するファイルを含む

通常の出力を抑制します。代わりに、印刷は通常、各入力ファイルの名前を印刷します。検索は最初の一致で停止します。

おすすめ記事