Jakiego zwięzłego polecenia mogę użyć, aby znaleźć wszystkie pliki, które NIE zawierają ciągu tekstowego?
Próbowałem tego (używając -v do odwrócenia parametrów grep) bez powodzenia:
find . -exec grep -v -l shared.php {} \;
Ktoś powiedział, że to zadziała:
find . ! -exec grep -l shared.php {} \;
Ale wydaje mi się, że to nie działa.
Ta strona ma ten przykład:
find ./logs -size +1c > t._tmp
while read filename
do
grep -q "Process Complete" $filename
if [ $? -ne 0 ] ; then
echo $filename
fi
done < t._tmp
rm -f t_tmp
Ale to uciążliwe i wcale nie zwięzłe.
ps: Wiem, że grep -L *
to zrobi, ale jak mogę użyć polecenia find w połączeniu z grep do wykluczonych plików, to jest to, co naprawdę chcę wiedzieć.
pss: Również nie jestem pewien, jak grep zawiera podkatalogi ze grep -L *
składnią, ale nadal chcę wiedzieć, jak go używać find
:)
Odpowiedzi:
LUB
W tym przypadku obliczamy liczbę pasujących wierszy (za pomocą
-c
) w pliku, jeśli liczba wynosi 0, to jest to wymagany plik, więc wycinamy pierwszą kolumnę, tj. Nazwę pliku z wyniku.źródło
grep
została ustalona ta nadal zakładamy żadnych nazw plików zawierających:
lub nowej linii znaków ...Znalezienie powinno działać, jeśli zmienisz
-v -l
(pliki, które nie pasują do żadnej linii) na-L
(pliki bez pasujących linii), ale możesz również użyć opcjigrep
rekursywnej (-r
):źródło
find . -exec grep -v -l shared.php {} \;
(i wszystkie inne warianty, które próbowałem) nie działa dla mnie. Jestem na OS X, ale nie sądzę, że to powinno mieć znaczenie. Dałem ci +1, ponieważ zapomniałem o tej-r
opcji.-L
Możesz użyć
find
igrep
polubić to:Tutaj
-print
jest wykonywana tylko wtedy, gdy poprzedni wyraz:! -exec ... {}
ocenia jakotrue
.Tak więc dla każdego znalezionego pliku
grep -q 'PATTERN'
jestexec
używany, jeśli wynik jestfalse
wtedy, całe wyrażenie jest! -exec grep -q 'PATTERN'
oceniane jakotrue
i nazwa pliku jestprint
edytowana.źródło
grep -L
, ponieważ będzie on zawierał również nieczytelne pliki na liście.Nie znaleziono pasującego wyniku według opcji -L
źródło
Myślę, że szukasz polecenia takiego jak
Opcji
-q
markigrep
zamknąć i po użyciu-execdir
trzeba-print
drukować odnaleziono plików.źródło