Re: ls | grep
On 07.01.06 14:06:29, Al Bogner wrote:
> Am Samstag, 7. Januar 2006 13:24 schrieb Rüdiger Noack:
> > Al Bogner wrote:
> > > Find geht aber in diesem Fall auch in die Tiefe, _darunter_ liegende
> > > Verzeichnisse sollen nicht mehr gelistet werden.
> >
> > find -maxdepth 0
>
> Ich brauche 1
Korrekt.
> drwxr-xr-x 3 ab ab 16 2006-01-07 13:50 a
> drwxr-xr-x 2 ab ab 6 2006-01-07 13:49 a_1
> drwxr-xr-x 2 ab ab 6 2006-01-07 13:49 a_2
> drwxr-xr-x 2 ab ab 6 2006-01-07 13:52 a_cd
> drwxr-xr-x 2 ab ab 6 2006-01-07 13:52 a_ef
> drwxr-xr-x 2 ab ab 6 2006-01-07 13:51 a_kb
> -rw-r--r-- 1 ab ab 0 2006-01-07 13:49 datei
>
>
> find -maxdepth 1 ! -regex ".*_[1|2]$" -type d
> .
> ./a
> ./a_kb
> ./a_cd
> ./a_ef
>
>
> Ich will damit eine Variable definieren und eine Schleife durchlaufen lassen.
> Den Punkt bzw. "./" kann ich nicht brauchen. Brauche ich da noch eine Pipe
> mit sed um das durch nichts zu ersetzen?
Du kannst mit -printf das Format selbst festlegen:
find -printf "%f\n"
gibt jedes Element auf einer eigenen Zeile aus.
> Das sieht zumindest nach nicht
> einfachem Quoting aus.
Wieso Quoting? Mit sed wuerde das so aussehen:
sed -e 's/^.\///'
> Also etwa so:
> var=`find .. | sed ..`
> for INP in $var`; do
^
der ist da zuviel und ausserdem geht das besser:
find .. | while read f ; do
Weil die Shell ueblicherweise ein Limit fuer die Anzahl an Argumenten
hat - also wenn die Dateimenge sehr gross wird gibts ne Fehlermeldung
mit der for-Schleife.
> Warum funktioniert das nicht:
>
> .find -maxdepth 1 ! -regex ".*_[cd|ef]$" -type d
Weil deine regex falsch ist, du wilslt
find .. -regex ".*_[ce][df]$" ..
man grep fuer die Regexes. [] Matcht auf eines der darin
eingeschlossenen Zeichen, das "|" ist IMHO unnoetig auch im oben
dargestellten Beispiel mit [1|2]. Du willst aber fuer _cd und _ef
zuerst c oder e matchen und danach d oder f. Mein Beispiel matcht
allerdings auch cf und ed, wenn du das noch genauer willst musst du wohl
(cd|ef) stattdessen nehmen (vorsicht die ()| muessen evtl. gequotet
werden mit \).
> Ich verstehe noch immer nicht, warum man das mit ls und dann mit einer Pipe
> mit (e)grep nicht auch lösen kann. Letztlich ist es mir aber egal, Hauptsache
> es passt.
Kann man auch:
ls -l | grep "^d" |grep -v".*[12]$"
aber wie man sieht brauche ich dafuer 2 greps, moeglich dass es auch in
einer geht aber sooo gut kenne ich regexps dann auch nicht.
Andreas
--
What happened last night can happen again.
Reply to: