• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Unix "ls": alles zeigen außer ...

Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
Ich suche schon so lange eine Möglichkeit, in meiner Shell mir Sachen anzeigen zu lassen und dabei einige Files auszuschliessen. Zum Beispiel möchte ich die .py Files sehen, aber die gleichnamigen .pyc Files nicht. da würde ich gerne auf der Konsole eingeben:

$ ls -al *.py<aber ohne>*.pyc

oder ich möchte Dateien "mv"en von einem Repository zu einem anderen, aber

$ mv * /ziel/pfad

überschreibt die .svn Ordner im anderen Repository. Die würde ich also gerne nicht mit kopieren.

Hab mir bisher immer mit recht umfangreichen Skripts geholfen (gestern eins zum moven ohne .svn geschrieben. waren ein paar hundert Zeilen am Ende und hat fast den ganzen Tag gedauert). Aber das Problem ist so allgemein, dass ich denke, dass es dafür schon eine allgemeine Lösung geben müsste. Kennt ihr eine? Z.B. eine entsprechende Option oder eine entsprechende kurz Formulierte Kombination von 2 Befehlen? Ich tippe mal auf grep, aber egal wie ichs zusammenschuster es spukt am ende garnichts aus, oder mehr als ich möchte.
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
was du suchst ist grep. man grep:

-v gibt nur Zeilen aus, die den Ausdruck nicht enthalten


also zb

ls -l | grep -v '*\.pyc$'


kann man noch mehr verfeinern, mit noch ner pipe erst grepst du alles was auf '\.py*' passt und dann schliesst du mit -v '\.*c$' die endung c aus. also zusammen

ls -l | grep '\.py' | grep -v '.*c$'

du musst punkte escapen, weil sie sonst als metazeichen des ausdrucks interpretiert werden ;)

€: sry kleine berichtigung und etwas entschlackt
 
Mitglied seit
02.09.2002
Beiträge
3.281
Reaktionen
106
Original geschrieben von 2FICKENDEHUNDE
was du suchst ist grep. man grep:

-v gibt nur Zeilen aus, die den Ausdruck nicht enthalten


also zb

ls -l | grep -v '*\.pyc$'

listet alles auf was nicht auf *.pyc passt, also alles andere auch. kann man noch mehr verfeinern, mit noch ner pipe erst grepst du alles was auf '*\.py*$' passt und dann schliesst du mit -v '*\.*c$' die endung c aus. probier mal bisken rum ist nicht so schwer
Meinst net find wär praktischer?
 
Mitglied seit
02.09.2002
Beiträge
3.281
Reaktionen
106
find /verzeichnis/hier/ ! -name *.pyc
bzw
find /verzeichnis/hier/ -not -name *.pyc

(allgemein, "ls | grep" schreit nach find)
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
das klappt, ja aber was machst du, wenn da nicht nur .py oder .pyc dateien sondern auch .xml, .c , .pl usw dateien drin sind? das tolle an grep und regulären ausdrücken ist, das man ganz präzise bestimmen kann, was genau man will und was genau nicht.


mal davon abgesehen, das find zwar sehr mächtig aber leider auch etwas performance lastiger ist.
 
Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
ah durch ein "/not" in "man find" hab ich jetzt auch die stelle mit den -nots entdeckt. Hätte mich auch echt gewundert, wenn es das nicht gäben würde, so oft wie ich das brauche. egal was manche leute sagen, durch so eine manpage durchzublicken ist garnicht so leicht, wenn man nicht weiss, wie das alles strukturiert ist. ^^ danke, an beide. Beides kann ich gut verwenden. find in der Konsole und dynamische ls | grep Konstrukte in Skripts die sich durchs Filesystem wühlen sollen um Ordnung reinzubringen :D

Wenn jemand noch andere Möglichkeiten weiß, wie man das gleiche mit anderen Befehlen erzielen kann: immer her damit! Mal ist das eine besser, mal das andere und ich weiss die Möglichkeiten meiner Shell vielleicht erst zu 10% zu nutzen (wenn überhaupt)
 
Mitglied seit
02.09.2002
Beiträge
3.281
Reaktionen
106
Original geschrieben von 2FICKENDEHUNDE
das klappt, ja aber was machst du, wenn da nicht nur .py oder .pyc dateien sondern auch .xml, .c , .pl usw dateien drin sind? das tolle an grep und regulären ausdrücken ist, das man ganz präzise bestimmen kann, was genau man will und was genau nicht.
Ok, du magst grep.
Aber was hat der von dir aufgeführe Fall mit der Problemstellung zu tun?

Übrigens ja, regexps sind toll. Für was genau hälst du die Konstrukte die find verwendet?
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
Original geschrieben von Dr.Willy

Ok, du magst grep.
Aber was hat der von dir aufgeführe Fall mit der Problemstellung zu tun?


das habe ich doch geschrieben. was genau passiert mit deinem befehl, wenn du diverse andere dateiendungen im zielverzeichnis hast aber nur .py kopieren oder verschieben willst?

dein befehl ist desweiteren nicht sinnvoll, weil er 1. alles finden würde, also auch dinge die gar keine dateien sind, zb links u.ä. und 2. sollte dein zielverzeichniss unterverzeichnisse haben, würde diese treffer ebenfalls mit ausgegeben. wenn du das alles berücksichtigst plus die von mir oben geschilderte problematik mit anderen dateiendungen, bist du bei find schnell bei einer komplexität, die ls -l | grep übersteigt. € oder du kommst um grep nicht herum:

find . -maxdepth 1 -type f -not -name "*.pyc" -print | grep 'py$'


wenn in dem verzeichnis ein paar hundert files liegen, kann das problematisch werden
 
Mitglied seit
02.09.2002
Beiträge
3.281
Reaktionen
106
Original geschrieben von 2FICKENDEHUNDE
das habe ich doch geschrieben. was genau passiert mit deinem befehl, wenn du diverse andere dateiendungen im zielverzeichnis hast aber nur .py kopieren oder verschieben willst?
Wie wärs mit mv *.py? :eek3:

Wie dem auch sei, ich kann den Problemen die du dir stellst jedenfalls nicht so recht folgen, aber du wirst dir schon was dabei gedacht haben. :confused:
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
hast du mal ausprobiert was du da vorschlägst?

find /verzeichnis/hier/ -not -name *.pyc

finde alles was nicht auf .pyc endet, also auch .xml, .irgendwas oder .schiessmichtot:

asdf@xyz$:~/pyctest> find . -not -name "*.pyc"
.
./abscdf2.py
./testit2
./testit2/abscdf2.py
./testit2/abscdf23.py
./testit2/abscdf234.py
./testit2/abscdf23.c
./testit2/abscdf23.xml
./testit2/abscdf23.txt
./testit2/abscdf23644.py
./testit2/zzzzzzzzzzzzzzz.py
./testit2/abscdf236443.py
./testit2/abscdf.py
./testit2/asdfg.pl
./testit2/abscdf23.pl
./abscdf23.py
./abscdf234.py
./abscdf23.c
./abscdf23.xml
./abscdf23.txt
./abscdf23644.py
./abscdf236443.py
./abscdf.py
./abscdf23.pl

findet das . verzeichnis, unterverzeichnisse und deren inhalte?:

:~/pyctest/testit2> ll
insgesamt 44
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf234.py
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf234.pyc
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf236443.py
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf236443.pyc
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf23644.py
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf23644.pyc
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf23.c
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf23.pl
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf23.py
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf23.pyc
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf23.txt
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf23.xml
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf2.py
-rw-r--r-- 1 users 0 13. Jan 18:15 abscdf.py
drwxr-xr-x 2 users 4096 13. Jan 19:34 asdfg.pl
-rw-r--r-- 1 users 0 13. Jan 18:19 zzzzzzzzzzzzzzz.py


er will aber möglicherweise nur .py aus dem akutellen verzeichnis verwenden. der befehl so wie er da steht ist einfach unpräzise und kann zu seiteneffekten führen die du gar nicht wolltest.
 
Mitglied seit
02.09.2002
Beiträge
3.281
Reaktionen
106
Original geschrieben von 2FICKENDEHUNDE
hast du mal ausprobiert was du da vorschlägst?
Ja, stell dir vor.

Zur Erinnerung:
"Ich suche schon so lange eine Möglichkeit, in meiner Shell mir Sachen anzeigen zu lassen und dabei einige Files auszuschliessen."
Genau das macht find. Wo ist das Problem?

2.: "find . -not -name *.pyc" listet dabei auch .xml Dateien auf. Natürlich tut es das.
Schliesslich suchst du nach "Alles ausser *.pyc". Wo ist da das Problem?

Dein Beispiel, erst alle Dateien aufzulisten, die auf *.py enden um dann daraus alle auf *.pyc endenden herauszufiltern ist unsinnig, weil in *.py von vornherein keine *.pyc Dateien enthalten sind.

Damit alle Klarheiten bereinigt?
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
ich gehe halt davon aus, dass noch was passiert mit der ausgabe. du anscheinend nicht, gut! wenn du das nur mal ne sekunde aus diesem gesichtspunkt sehen würdest, würdest du auch verstehen worauf ich hinaus will. ich will mich auch hier nicht streiten, es führen viele wege nach rom. ich wollte nur drauf hinweisen, dass man ganz präzise beschreiben kann, was man haben will. mehr nicht. und die lösung für die von mir geschilderte problematik, hab ich auch gleich gegeben - mit find und grep. :)


€ wobei

ls -l | grep '\.py' | grep -v '.*c$'

das selbe ist wie

ls -l | grep '.py$'

das war ein wenig verkompliziert , da hast du schon recht
 
Mitglied seit
02.09.2002
Beiträge
3.281
Reaktionen
106
Original geschrieben von 2FICKENDEHUNDE
€ wobei

ls -l | grep '\.py' | grep -v '.*c$'

das selbe ist wie

ls -l | grep '.py$'
... was wiederum das selbe ist wie

ls -l *.py ;)

Ok, belassen wir es dabei :cool:
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
jo is mir auch schon aufgegangen.

naja aber warum man find dafür benutzen sollte, ist mir immer noch nicht klar. dafür hast du keine schlüssige und nachvollziehbare begründung geliefert.
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
das problem ist einfach, dass der te nicht genau schreibt was er eigentlich will
nur .py anzeigen? -> ls *.py
alles aus .pyc anzeigen? -> ls --hide *.pyc
ok, das zweite funktioniert nichtmerh mit -a, da bräuchte man dann grep (oder find)
 
Mitglied seit
15.05.2003
Beiträge
11.307
Reaktionen
8
Ort
Fortuna 1895 Düsseldorf
hm --hide hab ich gar nicht in meiner version. meine bietet dafür -I an:

-I, --ignore=MUSTER
Implizierte Einträge, die auf das Muster MUSTER passen, nicht anzeigen.

aber das funktioniert irgendwie nicht.
 
Oben