Zakładając, że należy użyć narzędzia grep, chciałbym wyszukać ciąg tekstowy „800x600” w całym systemie plików.
Próbowałem:
grep -r 800x600 /
ale to nie działa.
Moim zdaniem, moje polecenie powinno rekurencyjnie grepować przez wszystkie pliki / foldery w katalogu głównym dla tekstu „800x600” i wyświetlać wyniki wyszukiwania.
Co ja robię źle?
Permission denied
błędów? Czy uruchomiłeś go jako root lub zwykły użytkownik?grep -r 800x600 / 2>/dev/null
. Możesz także spróbować uruchomić go jako root.Odpowiedzi:
Zwykle używam tego stylu poleceń do uruchamiania
grep
wielu plików:W rzeczywistości robi to listę wszystkich plików w systemie, a następnie dla każdego pliku wykonuje się
grep
z podanymi argumentami i nazwą każdego pliku.-xdev
Teza mówi, że musi znaleźć ignorować inne systemy plików - jest to dobre dla uniknięcia specjalnych systemów plików, takich jak/proc
. Jednak zignoruje również normalne systemy plików - więc jeśli na przykład folder / home znajduje się na innej partycji, nie zostanie przeszukany - trzeba by powiedziećfind / /home -xdev ...
.-type f
oznacza wyszukiwanie tylko plików, więc katalogi, urządzenia i inne pliki specjalne są ignorowane (nadal będzie się powtarzało w katalogach i będzie działaćgrep
na plikach w nim zawartych - po prostu nie uruchomi sięgrep
na samym katalogu, co i tak by nie działało). I-H
opcjagrep
nakazująca mu zawsze drukować nazwę pliku na wyjściu.find
akceptuje wszelkiego rodzaju opcje filtrowania listy plików. Na przykład-name '*.txt'
przetwarza tylko pliki z rozszerzeniem .txt.-size -2M
oznacza pliki mniejsze niż 2 megabajty.-mtime -5
oznacza pliki zmodyfikowane w ciągu ostatnich pięciu dni. Połącz je razem z -a dla i i -o dla lub i użyj'('
nawiasów')'
do grupowania wyrażeń (w cudzysłowach, aby zapobiec ich interpretacji przez powłokę). Na przykład:Spójrz na,
man find
aby zobaczyć pełną listę możliwych filtrów.źródło
-xdev
wykluczy wszystkie inne systemy plików, nie tylko specjalne. (np. jeśli/home
zamontowałeś jako oddzielną partycję, nie będzie ona przeszukiwana).find: paths must precede expression: /
xargs
Robiąc, możesz uniknąć przechodzenia z być może lepszą efektywnościąfind / -xdev -type f -exec grep -H '800x600' +
.+
znak na końcufind
polecenia faktycznie robi to samo, coxargs
: spawnuje jedengrep
proces z kilkoma argumentami.Zwykle nie chcesz przeszukiwać WSZYSTKO w systemie. Linux używa do wszystkiego węzłów plików, więc niektóre „pliki” nie są rzeczami, które chciałbyś przeszukać. Na przykład
/dev/sda
jest fizycznym urządzeniem blokującym dla pierwszego dysku twardego. Prawdopodobnie chcesz przeszukać podłączone systemy plików, a nie surowe urządzenie dyskowe. Jest też coś,/dev/random
co wyrzuca losowe dane za każdym razem, gdy je czytasz. Wyszukiwanie nie ma większego sensu. System/proc
plików jest również problematyczny w twoim przypadku.Poleciłbym jedną z dwóch rzeczy.
Nie szukaj w katalogu głównym, szukaj tylko miejsc, które mogą być przydatne. Szukaj
/home
lub/usr
lub/etc
Separatly. Informacje, których szukasz, są prawdopodobnie określonego typu, więc i tak mogą znajdować się w określonym folderze. Ustawienia konfiguracji powinny być włączone/etc
. Twoje pliki danych osobowych powinny znajdować się w/home
. Ograniczenie wyszukiwania do tak dużego obszaru, jak ten, znacznie zmniejszy twoje problemy z rekurencyjnymi grepami.Wyklucz problematyczne obszary
--exclude-dir
i zestaw rzeczy, których wiesz, że nie potrzebujesz:grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found
Wreszcie, często zdarza się napotkać kilka błędów „odmowy uprawnień” podczas wykonywania dużego rekurencyjnego grepa. W normalnym trybie użytkowania są pliki, których użytkownik może nie być w stanie odczytać. Dopóki są to tylko niektóre nieparzyste pliki, a nie surowe urządzenie dla twoich dysków twardych lub całego systemu plików proc, możesz po prostu zignorować błędy. W rzeczywistości możesz to zrobić w wierszu polecenia, wysyłając wszystkie błędy do nigdy nie wyląduj:
źródło
-I
wykluczać binarneDla uproszczenia sugerowałbym ack-grep . Link pokazuje wiele przypadków, kiedy
ack-grep
jest lepszym rozwiązaniem.Aby użyć, po instalacji:
źródło
Innym sposobem patrzenia na to jest ten sposób:
źródło
* następnie otrzymuję / proc / sysrq-trigger: błąd wejścia / wyjścia
Twoje polecenie działa, pojawia się ten błąd, ponieważ próbujesz skanować uruchomione procesy w poszukiwaniu łańcucha.
Polecam wykluczenie katalogów systemowych z
grep -exclude-dir = {proc, sys} "800x600" /
źródło
po prostu w prawo-
-Co jest nie tak w obecnym poleceniu, to cudzysłowy „”. Zawsze umieszczaj argument ciągu
grep
w cudzysłowie.źródło
grep
. Spróbuj, a zobaczysz. Umieść ciąg „800x600” w pliku, a wtedygrep 800x600 file
zobaczysz, że działa dobrze. OP ma oczywiście inny problem.