2011-06-14 10 views
7

Próbuję wymyślić, jak uzyskać listę nazw plików dla pliku o nazwie BOZO, ale kończąc na TYLKO 123 LUB 456.Lista tylko niektórych plików w katalogu odpowiadającym wyrazowi BOZO i kończąc na '123' lub '456'

pliki są:

BOZO12389,
BOZOand3
BOZOand456
BOZOand5
BOZOhello123

więc polecenie powinno tylko wyświetlanie "BOZOhello123" i "BOZOand456"

Nie mogę tego rozgryźć. Wypróbowałem wszystkie formy LS i GREP, które mogę wymyślić. Zabawne jest to, że próbowaliśmy zrobić to w klasie przez około 10 minut i nikt nie mógł tego dostać (w tym instruktora).

+1

Nie mogę uwierzyć, że instruktor nie będzie w stanie rozwiązać ten problem tak długo. –

+0

Dzięki chłopaki! Nie spędzaliśmy zbyt wiele czasu, ale z jakiegoś powodu natychmiast myślę "grep", a wszyscy inni próbowali to zrobić za pomocą "ls". Dlatego było to pierwsze pytanie dotyczące pracy domowej na tę noc. – Geordie

Odpowiedz

0

To nie powinno być takie trudne. Najbardziej naiwny sposób to ls katalog, a następnie grep tylko za to, co chcesz:

$ ls *BOZO* | grep -e '123$' -e '456$' 
8

Korzystanie globs Shell:

ls BOZO*{123,456} 
+0

Uwaga, wymaga to bash, zsh lub innej zaawansowanej powłoki. Nie jest przenośny i nie będzie działać w wielu systemach '/ bin/sh'. –

10

zrobiłem następujące i to działało

ls BOZO*456 BOZO*123 
+0

Smartass. I LoL'ed. – chrisdowney

2

Użyj wyrażeń regularnych, aby ci pomóc. Polecenie egrep powinno pomóc, ponieważ pozwoli ci używać wyrażeń regularnych.

szukasz aktach BOZO456 rodzaju i BOZO123

okres . jest dzika karta, co pozwala zastąpić <anything>. * pozwoli ci powtórzyć to 0 lub więcej razy. Umieszczając około 123 i 456 nawiasów okrągłych, zasymulujesz OR.

Zatem chcesz dowolny znak powtórzony 0 lub więcej razy, a następnie przez 123 lub 456.

Przykład:

egrep "BOZO.*(456|123)" data

Dziękuję Nathan Fellman za pomoc i edycji.

+0

Zgadzam się, ponieważ jest to błędne w odniesieniu do dzikiej karty. W wyrażeniach regularnych '.' jest zwykle symbolem wieloznacznym, a' * 'oznacza" 0 lub więcej razy ", więc pasuje to do 'BOZ456', 'BOZOOOOOOOO123' itd. ... –

+0

Naprawiono!Dziękuję za wyrazy uznania i przepraszam: $ – digerati32

+0

To nadal nie jest w porządku. Dopasuje to 'BOZOa456' i' BOZOx123', ale nie 'BOZOOO123' ani nawet' BOZO123'. To czego potrzebujesz to "BOZO. * (456 | 123)" –

1

Można również użyć znaleźć polecenie:

find . \(-name "BOZO*123" -o -name "BOZO*456" \) 
+1

To przemierza dzieci. Chcesz 'znaleźć. -maxdepth 1 -name "BOZO * 123" -o -name "BOZO * 456" '(w tym przypadku nawiasy nie są konieczne). –

Powiązane problemy