[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: