• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Bitte um Hilfe: Ein bestimmte Ausgabe zu erzielen::

revealed

Guru
Hallo!

ich benötige für ein Script eine Befehlszeile.

In einem Verzeichnis liegen 100 Dateien. Diese haben immer ein unterschiedliches Datum.

Die 10 Neuesten Davon nach Datum möchte ich in eine Textdatei geschrieben haben.

Der Ansatz:
Code:
ls -c  pfad/*.* >pfad/txt.txt

Am Ende soll es ein Kontrollstruktur werden, die 10 x abgearbeitet wird.
Die Ergebnisse im Textdokument sollen der Reihe nach dann abgearbeitet werden. Ich benötige aber zunächst obriges.

Bitte euch um Hilfe.

Vielen Dank im Vorraus!

Gruß

R
 
A

Anonymous

Gast
nach der Zeit sortieren lassen aber in umgekehrter Reinfolge dann mit tail die 10 jüngsten ausfiltern.

Code:
ls -tr /path/*.* | tail -10

wahrscheinlich suchst du so was hier.
Code:
for DATEI in `ls -tr /path/*.* | tail -10`
 do
  mache irgend etwas mit $DATEI
done

robi
 
Beteilige mich auch mit einem Vorschlag :)

Code:
find ~/MUSIK/Lastfm/ -mtime -10 -printf "%Aj%AH%AM%AS %p\n" | sort -u | tail -n 10 | cut -c 11-

Hintergrund: Ich dachte mir , am besten ist es alles erstmal nach Zeit zu sortieren, anschließend die 10 neuesten abzuspalten und dann den Zahlenverhau (den man ja nun nicht mehr braucht) abzuspalten.

Gruß Peter
 
OP
revealed

revealed

Guru
Hmm...

also ich hab so angefangen:
Code:
#set -x
## 
## Pfade:
fax="/var/spool/asterisk/fax";
processed="var/spool/asterisk/fax/bearbeitet";
##
## Prüfung, ob schon 10 neue Faxe eingegangen sind:
##
# VAR f. Dokumentanzahl und Anzahl der Docs:
pdfanzahl="$( ls -al /var/spool/asterisk/fax/ | wc -l )";
mindestzahl="10"
## Schleifenstruktur: wenn Dokumente weniger 10 Nix zu tun (ansonsten):
# Zähle Dateien und schreibe in Textdatei
auftrag="auftrag_"
if [ "$pdfanzahl" -lt "$mindestzahl" ];
  then
   echo "Es sind weniger als 10 Faxe zur Bearbeitung -- Beende Operation!";
   exit 0;
  else
   echo "Es sind mehr als 10 Faxe vorhanden, starte Operation!";
   # Erstelle Textdokument für Dateinamen:
   touch $fax/$auftrag`date +%c-%m-%Y`.txt;
   # Schreibe Alle Dateien in ein Textdokument:

Die Liste möchte ich dann an LPR senden und anschliessend die 10 neuesten Dateien mit einem Vermerk in form Dateiname-Datum unter Bearbeitet ablegen;

Als Cronjob Stündlich.

Ich versuch das mal zu skizzieren:

for DATEI in `ls -tr /path/*.* | tail -10`
do
OP1 lpr
OP2 mv
done
touch bearbetitet_`date +%c-%m-%Y`.txt;
und emaile die txt an bestimmte emailadresse;

Lieg ich da richtig? Dann würde er die neuesten zuerst nehmen?

... ich weiss nich, ob ich da schon wieder unnötig rumspinn:

Code:
ls -tr Desktop/PDFs/*.* | tail -10 | awk -F \Fs/ '{ print $2}'
Testpdf12.pdf
Testpdf13.pdf
Testpdf14.pdf
Testpdf15.pdf
Testpdf16.pdf
Testpdf17.pdf
Testpdf18.pdf
Testpdf19.pdf
Testpdf20.pdf


Gruß

R

PS.: SUPER VIELEN DANK für die Hilfe! :)
 
Oh mann... schon wieder ls. Lernt doch endlich dass das nicht zum Pipen gedacht ist weil der Output durch externe Variablen beeinflusst wird kann! Stell dir mal vor ein User hat sich LS_OPTIONS="-F" eingestellt. Oder LS_OPTIONS="-go".
 

regexer

Advanced Hacker
jengelh schrieb:
Oh mann... schon wieder ls. Lernt doch endlich dass das nicht zum Pipen gedacht ist weil der Output durch externe Variablen beeinflusst wird kann! Stell dir mal vor ein User hat sich LS_OPTIONS="-F" eingestellt. Oder LS_OPTIONS="-go".
Stimmt! Hinzu kommt noch das berühmte space-im-Dateinamen-Problem. Trotzdem wäre ich jetzt auf deine Lösung gespannt. Denn es ist klar, dass als quick'n'dirty-Lösung erstmal ls -rt | tail -10 naheliegend ist...
 

abgdf

Guru
Also, ich würde sowas lieber mit Python (oder Perl) machen. In Python gibt's z.B. "os.path.getatime(file)", das die Zeit des letzten Zugriffs auf eine Datei anzeigt.

Gruß
 

regexer

Advanced Hacker
abgdf schrieb:
Also, ich würde sowas lieber mit Python (oder Perl) machen. In Python gibt's z.B. "os.path.getatime(file)", das die Zeit des letzten Zugriffs auf eine Datei anzeigt.
Obwohl ich kein Phyton-Geek bin, vermute ich, dass intern genauso die stat-Funktion aufgerufen wird. Von daher ergibt sich nicht unbedingt ein Vorteil. Außer vielleicht, dass man leichter sortieren kann.

Um ehrlich zu sein wollte ich jetzt eine saubere und möglichst elegante shell-Lösung sehen. Aber mir fällt im Moment auch keine wirlich gute ein... :oops:
 
OP
revealed

revealed

Guru
uff!

Also mit pyton und perl bin ich überfragt!

Ich würde das gerne als simples Shellscript auf einem rusty old 200 Mhz PC laufen lassen... *g*

Heute brauch ich n bisschen denkpause. Wenn ich wieder luft habe lese ich den Thread in Ruhe.

Hatte heute nen Haufen Mitarbeiter um mich, die noch etwas schulungsbedarf haben. Macht echt Spaß aber strengt auch n bisschen an.

Die syntax des anderen Befehl muss ich erstmal nachvollziehen. Das ergibt sich mir so beim Ersten Lesen noch nicht.

Gruß

R

PS.: Im Shellscript hätte ich den Befehl in etwa so übergeben:
Code:
VAR="$( ls -tr Desktop/PDFs/*.* | tail -10 | awk -F \Fs/ '{ print $2}'  )"
 

abgdf

Guru
Hi,

nur so als Demo (ich weiß, Du willst es gern in bash, aber das ist leider nicht so mein Ding). Jedenfalls:
Dieses Python-Skript gibt die 10 neuesten Dateien im Verzeichnis aus:
Code:
#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import os
import sys

s = sys.argv[0]

if s.startswith("./"):
    s = s[2:]

if s.startswith(os.getcwd() + "/"):
    s = s[len(os.getcwd()) + 1:]

a = os.listdir(os.getcwd())

if s in a:
    a.remove(s)

b = {}

for i in a:

    if os.path.isfile(i):
        b[os.path.getatime(i)] = i

c = b.keys()

c.sort(reverse = True)

nr = len(c)
if nr > 10:
    nr = 10

for i in range(nr):
    print b[c[i]]
Edit: Das Skript selbst ist dann natürlich auch im Verzeichnis, es wird bei der Ausgabe allerdings ignoriert.

Gruß
 
OP
revealed

revealed

Guru
re# danke!

Das ist echt schön und nett :)

Aber du machst dir leider unnötig arbeit, da ich das als Shellscript oder Bashscript halten möchte. :s

Ich muss das nachvollziehen können. Leider kann ich perl und python nicht nachvollziehen.

Gruß

R
 

abgdf

Guru
Lernt doch endlich dass das nicht zum Pipen gedacht ist weil der Output durch externe Variablen beeinflusst wird kann! Stell dir mal vor ein User hat sich LS_OPTIONS="-F" eingestellt. Oder LS_OPTIONS="-go".
Werden die allgemeinen Optionen nicht durch die auf der Kommandozeile gegebenen, spezielleren Optionen überschrieben ?
Hinzu kommt noch das berühmte space-im-Dateinamen-Problem.
Ich weiß nicht: Tritt das überhaupt auf, wenn eine Datei pro Zeile gelistet wird wie mit "ls -1" ?

Also, shellmäßig wäre ich trotz allem immer noch für "ls".

Gruß

P.S: Wie kriegt man "ls" eigentlich dazu, nur Dateien, keine Verzeichnisse zu zeigen ? Kann das irgendwie in "man ls", "info ls" nicht finden.
 
Schade das meine Lösung scheinbar noch nicht mal eines Blickes gewürdigt wurde. Denn ich finde das meine Lösung hervorragend funktioniert.
Habe ich evtl etwas falsch verstanden???

Gruß Peter
 
OP
revealed

revealed

Guru
hm...

Also eine Passable Textdatei bekomme ich so:
Code:
filelist="$( ls /var/spool/asterisk/fax/*.pdf | sort -u | tail -n 10 | cut -c 30- >> $fax/$auftrag.txt )"
Wie schicke ich die 10 Filenames jetzt einzeln in die Mühle?

jedes PDF soll einmal verhschoben werden mit MV
und einmal mit lpr gedruckt werden.

Kann mir jemand helfen?

Gruß

R
 
Code:
for datei in `find ~/dein/Pfad/ -mtime -10 -printf "%Aj%AH%AM%AS %p\n" | sort -u | tail -n 10 | cut -c 11-` 
do
mv ${datei} wohinauchimmer
lpr ${datei}
done

Das ganze natürlich auf deine Bedürfnisse anpassen.
Vorteil bei meiner Variante. Du hast das umstrittene ls los.

Gruß Peter
 
OP
revealed

revealed

Guru
Ich hab so ein bisschen Probleme for Schleifen zu verstehen;

ehm,

Der Ausdruck "datei" woraus ... muss ich den nicht definieren?

Da hab ich ein richtiges Problem das zu verstehn...

Vielen vielen Dank!

Gruß

R
 
abgdf schrieb:
Lernt doch endlich dass das nicht zum Pipen gedacht ist weil der Output durch externe Variablen beeinflusst wird kann! Stell dir mal vor ein User hat sich LS_OPTIONS="-F" eingestellt. Oder LS_OPTIONS="-go".
Werden die allgemeinen Optionen nicht durch die auf der Kommandozeile gegebenen, spezielleren Optionen überschrieben ?
Die am nächsten korrekte Lösung im Segment der Falschen wäre `ls -1 *.pdf`, aber probier doch mal...
Code:
export LS_OPTIONS="-l";
ls -1
Und nun versuch mal das -l umzudrehen. Über hin oder Umwege ginge, vielleicht,
Code:
LS_OPTIONS="" ls -1
oder
/bin/ls -1
oder
command ls -1
aber beide auch nicht soo schön, weil man wirklich nie genau weiß, welche Nebeneffekte auftreten. Es könnte ja /bin/ls durch eine non-GNU Version ersetzt worden sein.
 
Habe gerade nach einem geeigneten Link gesucht, aber vergeblich.
Dann versuche ich mal mit eigenen Worten:

Grundstruktur:
for VARIABLE in LISTE
do
Befehl ${VARIABLE}
done

die for-Schleife holt sich nacheinander die aus der aus der Liste was es als nächstes benötigt. Das speichert sie in der VARIABLE ab. Diese Variable muss aber im nächsten Schritt gekennzeichnet werden:
$VARIABLE
Die geschweiften Klammern braucht man nicht immer. Ich mache sie nur aus Gewohnheit immer dazu.
Anstelle von VARIABLE kannst du aber auch datei oder hans oder dampf oder schreiben was du meinst.
Und für Liste gibt es auch verschiedene Möglichkeiten.
In meinem Beispiel verwende ich eine Kommandosubstitution ``
Was sich zwischen den beiden Backticks befindet wird erst ausgewertet und dann das Ergebnis Stück für Stück an die for-Schleife abgegeben.

Ich bin nicht gut in erklären. Ich hoffe aber trotzdem das ich es halbwegs verständlich rübergebracht habe.

Gruß
 

regexer

Advanced Hacker
abgdf schrieb:
Hinzu kommt noch das berühmte space-im-Dateinamen-Problem.
Ich weiß nicht: Tritt das überhaupt auf, wenn eine Datei pro Zeile gelistet wird wie mit "ls -1" ?
Wenn man das so wie in der oben geposteten for-schleife verarbeitet: Ja! Probier's aus ...

P.S: Wie kriegt man "ls" eigentlich dazu, nur Dateien, keine Verzeichnisse zu zeigen ? Kann das irgendwie in "man ls", "info ls" nicht finden.
Entweder mit find arbeiten oder für jeden Eintrag einen test -f machen. Auf den ls-man-pages könnte die Option "-d" in die Irre führen. Sie ist nur dafür da, dass er in Verzeichnisse, die als Argumente übergebenen wurden, nicht absteigt.
 
Oben