Puoi farlo solo con grep (senza find).
grep -riL "somestring" .
Questa è la spiegazione dei parametri utilizzati su grep
-L, --files-without-match
each file processed.
-R, -r, --recursive
Recursively search subdirectories listed.
-i, --ignore-case
Perform case insensitive matching.
Se usi l
minuscolo otterrai il contrario (file con corrispondenze)
-l, --files-with-matches
Only the names of files containing selected lines are written
Il comando che citi, abbastanza ironicamente, fa esattamente quello che descrivi. Provalo!
echo "hello" > a
echo "bye" > b
grep -iL BYE a b
Dice un solo.
Penso che potresti confondere -L e -l
find . -print | xargs grep -iL "somestring"
è l'inverso di
find . -print | xargs grep -il "somestring"
A proposito, considera
find . -print0 | xargs -0 grep -iL "somestring"
O anche
grep -IRiL "somestring" .