Żeby uniknąć aliasów dla ls wywołajmy je jako /bin/ls, pokazując przy okazji przykład:
rip $ /bin/ls -l
razem 8
drwxr-xr-x 2 arctgx arctgx 4096 mar 8 00:46 boczek
drwxr-xr-x 2 arctgx arctgx 4096 mar 8 00:44 kości
-rw-r--r-- 1 arctgx arctgx 0 mar 8 00:46 talerz
-rw-r--r-- 1 arctgx arctgx 0 mar 8 00:45 trumnA
Aliasy mogłyby wywołać ls z opcją dającą gwiazdki, ukośniki czy inne dziwne znaki na końcu linii. Jakkolwiek ukośnik przydałby się tu, to z plikami już gorzej. Zamiast ukośnika wykorzystamy d na początku dla katalogów.
Skąd wzięła Ci się opcja -l w grep? Nie filtrujesz przecież plików tylko standardowe wyjście polecenia ls. To co robisz, jest powiedzeniem, by wyszukać linie kończące się na A, a potem wśród nich wyszukać linie kończące się na i, czyli
zbiór pusty w efekcie
![Wink ;)](http://forum.linux.pl/Smileys/default/wink.gif)
Spójrzmy na jedno z podejść:
rip $ /bin/ls -l | grep -E '^-.*A$|^d.*i$'
grep: błędna opcja -- .
Składnia: grep [OPCJA]... WZORZEC [PLIK] ...
Napisz `grep --help' żeby dowiedzieć się więcej.
Celowo wrzuciłem z błędem. Kreska w wyrażeniu regularnym grepa została przechwycona przez (niech ktoś dopisze czy grepa, powłokę, czy może jakąś funkcję systemową GNU) ... jako początek kolejnej opcji. Żeby nie interpretować kreski w ten sposób, trzeba wskazać grepowi miejsce, gdzie kończą się opcje i kreska ma być interpretowana dosłownie:
rip $ /bin/ls -l | grep -E -- '^-.*A$|^d.*i$'
drwxr-xr-x 2 arctgx arctgx 4096 mar 8 00:44 kości
-rw-r--r-- 1 arctgx arctgx 0 mar 8 00:45 trumnA
A teraz słowo o tym, co znaczą kawałki. Żeby użyć alternatywy (
|), skorzystałem z rozszerzonych wyrażeń regularnych (opcja -E). No i masz dwa wyrażenia, w których pomiędzy znakiem początku i końca linii występuje co trzeba.
Jedno ciche założenie: Twoje "pliki" rozumiałem jako zwykłe pliki.
P.S. Jeszcze do @ultra, który zdążył mnie wyprzedzić
![Smiley :)](http://forum.linux.pl/Smileys/default/smiley.gif)
Pomysł z findem powinien zmieścić się w jednym poleceniu (zobacz spójnik -o).