Próbuję skomponować grep
oświadczenie, które mnie zabija. Jestem też zmęczony otrzymywaniem arguments list too long
błędu. Mam plik, nazwijmy go subset.txt
. Zawiera setki linii z określonymi ciągami, takimi jak MO43312948
. W moim katalogu obiektowym mam tysiące plików i muszę skopiować wszystkie pliki zawierające łańcuchy wymienione w subset.txt
innym katalogu.
Próbowałem zacząć od tego, aby po prostu zwrócić pasujące pliki z katalogu obiektów.
grep -F "$(subset.txt)" /objects/*
Ciągle pojawia się `bash: / bin / grep: Lista argumentów za długa``
"$(subset.txt)"
takie polecenie? To jest podstawianie poleceń , które spowoduje, że twoja powłoka zostanie wykonanasubset.txt
(tak jakby to była komenda lub skrypt).Odpowiedzi:
Można przekazać katalog jako cel do
grep
z-R
oraz pliku wzorców wejściowych z-f
:Więc szukasz:
Możesz uzyskać listę pasujących plików za pomocą:
Jeśli więc twoja ostateczna lista nie jest zbyt długa, możesz po prostu:
Jeśli to zwróci
argument list too long
błąd, użyj:A jeśli twoje nazwy plików mogą zawierać spacje lub inne dziwne znaki, użyj (zakładając GNU
grep
):Wreszcie, jeśli chcesz wykluczyć pliki binarne, użyj:
źródło
mv
wywołań z jednym argumentem:... | xargs -0 mv -t bar/
(zakładając, żemv
obsługuje tę-t
opcję).posługiwać się
powiedzieć grepowi, żeby czytał z
subset.txt
pliku.możesz użyć polecenia find do przejścia pliku.
lub
źródło
find
zamiast-r
innych niż dodatkowe filtrowanie?grep -r
wyszukuje dowiązania symboliczne do zwykłych plików, które mogą, ale nie muszą być pożądane (jeśli wskazują w tym samym drzewie, przeszukujesz ten sam plik dwa razy; jeśli wskazują na zewnątrz, przeszukujesz plik, który może, ale nie musi, być być pożądanym).grep
mają opcje kontrolowania ich interakcji z dowiązaniami symbolicznymi (wman grep
celu określenia specyfiki bieżącego systemu). Rekursywnegrep
będzie znacznie szybsze niż uruchamianiegrep
pojedynczo dla każdego pliku za pośrednictwemfind
.-exec +
, więc grupuje pliki i nie uruchamia jednego grep na plik.-exec {} +
vs-exec {} \;
... każdego dnia uczysz się czegoś nowego (wciąż nie widzę powodu, dla którego pojedynczy rekurencyjnygrep
nie byłby szybszy niż wielokrotnygrep
bieg zfind
powodu tworzenia procesów i analizowania wzorców, ale ja nie mam pod ręką konkretnych numerów, aby to zrobić).Jeśli chcesz jeszcze bardziej przyspieszyć grep, możesz ustawić ustawienia narodowe w swojej powłoce przed jej uruchomieniem, tzn. Użyj „LC_ALL = c”. Zostanie to odziedziczone do grep i wyłączy przetwarzanie Unicode, gdy nie będzie to konieczne, aw niektórych przypadkach może znacznie przyspieszyć grep. Świetny blog dokumentujący to można znaleźć na stronie http://www.inmotionhosting.com/support/website/ssh/speed-up-grep-searches-with-lc-all . Ta sztuczka może także przyspieszyć skrypty powłoki bash, nie tylko grep.
źródło