Jeśli zrobię:
$ ls -R
.:
4Shared/ Cloud/
./4Shared:
UFAIZLV2R7.part3.rar
./Cloud:
UFAIZLV2R7.part2.rar.part
UFAIZLV2R7.part1.rar.part
UFAIZLV2R7.part4.rar.part
Jeśli chcę wylistować .rar
tylko pliki i użyję grep , pokaże mi także .rar.part
pliki, czego nie chcę.
Rozwiązuję to za pomocą find
lub ls **/*.rar
jak powiedziano w tym wątku i działają one dobrze, ale chciałbym się dowiedzieć, czy można to zrobić za pośrednictwem grep
.
Próbowałem (zastanawiając się EOL
):
ls -R | grep ".rar\n"
bez rezultatów.
Myślę, że problem polega na odkryciu, czy greping znajduje się na końcu linii , ale nie jestem pewien.
Jakaś pomoc tutaj?
grep
w tym przypadku? Dlaczego niefind
?find
polecenie jest w konflikcie z Windowsem) i ... nauka ;-). Pytanie nie dotyczy „ls -1R
.grep
. Zobacz moją odpowiedź.-1R
przełącznika. Najwyraźniej wyniki są takie same.Odpowiedzi:
$
Kotwica dopasowuje koniec linii.Możesz również użyć
find
do tego:źródło
Oprócz pytania pamiętaj, że
.rar
nie tylko pasuje do „.rar”, ale także do każdego znaku (w tym.
) przedrar
. W tym przypadku prawdopodobnie nie jest to problem, ale.
należy go unikać w wyrażeniach regularnych.źródło
.asc
jest jak*asc
wzorzec? Więc będzie pasować na przykładwhereverasc
.xrar
.Możesz również poinstruować,
grep
aby szukać łańcucha od granicy słowa. A.
jest jedną z takich granic.Przykład
Powiedz, że mam te przykładowe dane.
To polecenie odnalazłoby tylko plik z
.rar
rozszerzeniem.Jak to działa
Sytuacje, w których to nie zadziała
Jeśli masz pliki o nazwach,
blah-rar
zostaną one również wykryte.Wynika to z faktu, że znaki inne niż alfanumeryczne są zwykle uważane za znaki graniczne, a więc wymykałyby się temu podejściu.
źródło
"
zamiast prostych cudzysłowów?.rar
. Ale to nie będzie problem z użyciemls -R
. Tylko jeśli zdarzyło Ci się użyćls -Ra
.-P
Przełącz się nagrep
w moim przykładzie. To powoduje interpretację argumentu przez PCRE.\n
), który jest znakiem prawnym.ls -1R
Zmusi pliki mają być wyświetlane w jednej kolumnie niezależnie.Po prostu zrób :
W ogóle nie potrzebujesz
grep
.UWAGA: Powyższe działa ... z wyjątkiem tego, że wciąż się pojawia
afile-rar
i nie rozumiem dlaczego. Zostawię to tutaj, ale nie jestem z tego dumny. W każdym razie, jak powiedzieli inni:źródło
xrar
lubafile-rar
.afile-rar
ixrar
nadal są uwzględniane w danych wyjściowych. Brak zmian w najnowszych modach. Paskudny problem nie? Zabawnie jest próbować go rozwiązać bez zwykłych metod 8-)-dash
.xrar
Rzeczą, jaką może obsłużyć, ale nie-dash.
mogę nie zrozumieć-dash.
Użyj pojedynczych cudzysłowów, aby $ działał jako koniec linii. Jeśli chcesz również grepować przy pomocy jakiejś zmiennej, użyj kombinacji podwójnych i pojedynczych cudzysłowów jak poniżej:
Mój poprzedni post został usunięty, mówiąc, że jest zduplikowany. Pozwól mi wyjaśnić, jak to jest inaczej.
Pozostałe posty wspominają albo o pełnym wykorzystaniu podwójnych cudzysłowów
""
, albo o pełnym wykorzystaniu pojedynczych cudzysłowów''
. Oba mają swoje własne ograniczenia. Wyjaśnia to.Problem ze wszystkimi podwójnymi cudzysłowami jest następujący:
grep "pattern$"
daje następujący błąd:Illegal variable name.
I użycie wszystkich pojedynczych cudzysłowów działa, ale jeśli chcesz podstawić zmienne, wszystkie pojedyncze cudzysłowy nie będą działać. Na przykład:
Jeśli mam ciąg
A_BOOK
, w tym inne ciągi w pliku PLIK.Jeśli ustawię BOOK na zmienną BK
Jeśli grep ze wszystkimi podwójnymi cudzysłowami, otrzymuję następujący błąd::
grep "${BK}$" FILE*
1st $ dla podstawienia zmiennej, 2nd dla końca wzorca ( niedozwolona nazwa zmiennej ).Jeśli grep ze wszystkimi pojedynczymi cudzysłowami, podstawienie zmiennej nie nastąpi.
grep '${BK}$' FILE
nic nie zwracaJeśli użyję kombinacji podwójnych i pojedynczych cudzysłowów, otrzymam to, czego oczekuję. Podwójne cudzysłowy dla podstawienia zmiennej i pojedyncze cudzysłowy dla końca wzorca.
źródło
"foo$"
Składnia działa dobrze na sh i rodziny.Jeśli po wykonaniu powyższego i nic nie działa, może to być spowodowane zakończeniami linii. Aby to naprawić, wykonaj:
dos2unix pr0n.txt
i wykonajgrep
ponownie.źródło