Shell-Script-Spezialisten gesucht

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Shell-Script-Spezialisten gesucht
Hi,
Bei einer Übungsaufgabe zu Textmining sollen verschiedene Newsgroup-Beiträge untersucht werden. Die einzelnen Postings liegen jeweils als kleine, nummerierte Dateien vor (pro Posting eine Datei), und die Dateien sind in Verzeichnisse (20 Stück) sortiert, der Name des Verzeichnisses entspricht dem Namen der Newsgroup in die der entsprechende Beitrag gepostet wurde. Für jede Newsgroup habe ich 1000 Beiträge, also liegen in jedem Verzeichnis 1000 Dateien.

Mein Programm das diese Daten analysieren soll packt diese Menge an Daten leider nicht, deswegen wollte ich die Anzahl der Postings reduzieren. Dafür wollte ich ein shell script schreiben, dass in jedes Verzeichnis schaut und alle Dateien bis auf die ersten 100 löscht.

Dafür wollte ich sowas schreiben:

n=1
for i in `ls -zeige_mir_nur_dateien_an`
do
n++
if n>100
then rm $i
fi
done

Und das ganze dann auch rekursiv für die Verzeichnisse, wobei ich dann eine option für das ls brauche das mir nur Verzeichnisse anzeigt.
Ich bräuchte also eine Option für das ls dass mir nur Dateien/nur Verzeichnisse anzeigt. Nach dem Studium der Man-Page von ls bin ich aber ziemlich enttäuscht über die möglichen optionen… ich meine mich zu errinern dass ich sowas ähnliches mal unter Dos gemacht habe, da hatte das Dos-dir aber wesentlich mehr optionen für die Darstellung. Ist es möglich dass hier dir tatsächlich ls überlegen ist 8-( ?
Gibt es noch andere elegante Voschläge für die Lösung dieses Problems?


Mit nem grep die Zeilen rausnehmen, die auf “/” enden könnte funktionieren, oder?


Ich wuerde

stat --format=%F datei.extension

benutzen. Den Output “directory” oder “regular file” kannst du dann in deinem Shell-Skript vergleichen.

Gruesse,
-Steppenwolf


kannste ein kleinwenig perl?
weil damit dein problem sich schnell loesen wuerde.
der ls befehl ist wie robert schon erwaehnt hat
“ls -lp | grep /” … fuer files kann man den grep ja einfach umkehren.

und fuer die ersten 100 kannste in perl z.b.

@dirc = ls -ap | grep / ;
$pwd = pwd ;

foreach (@dirc)
{
@files = glob($pwd."".$_);
for ($i = 101 ; i <= $files; i++)
{ $return = rm -rf $pwd."\".$_.$files[$i] ; }
}

ich hab das jetzt zwischen tuer und angel hingecoded
… also wahrscheinlich net bugfrei,
aber die idee ist ja klar.


Na wenn sich hier so viele Spezialisten tummeln, könnt ihr mir vielleicht auch helfen:

Aus einem ps -A | grep synergys erhalte ich sowas
5000 ? 00:00:10 synergys

Jetzt möchte ich mit der pid ein
kill 5000
aufrufen.

Wie mache ich das in einem Skript? Klappt’s in einer Zeile??


killall synergys


head waer dafuer die beste lsg gewesen, da kannst die ersten 100 allerdings auch ‘alles ausser den ersten 100’ selektieren.


Danke euch allen für die schönen Tipps. Ich bin jetzt aber schon ein wenig enttäuscht dass das Ausgabeformat vom ls tatsächlich so unflexibel ist.
Ich denke ich werde die shell-programmierung zugunsten der Perl-Programmierung aufgeben, Perl ist mir irgendwie sympatischer…