Beiträge von DosAmp

    Entweder ist etwas an der Kernel-Kommandozeile kaputt (der Kernel hängt statt einem Linux- ein FAT-Dateisystem ein, kann darauf /dev mangels entsprechenden Verzeichnis nicht einhängen und findet dann auch kein Init-Programm) oder ein vorhandenes initramfs (mit einem Namen wie initrd.img) wird nicht zusammen mit dem Kernel geladen, wobei es nicht danach aussieht, als ob ein solches vorhanden ist.
    Wenn ich diesen Artikel als Grundlage heranziehe, was gibst du als root-Parameter an? Es ist etwas verwirrend, dass der Guide davon spricht, dass /dev/mmcblk0 die interne eMMC und /dev/mmcblk1 die SD-Karte (und /dev/sda der USB-Stick) sein soll, aber der Kernel zusätzlich Meldungen zu einem dritten MMC-Bus namens mmc2 ausgibt.


    Mag sein, dass es eine elegantere Lösung gibt (irgendeine via set setzbare Shell Option?), weil das ja eine verbreitete Stolperfalle sein dürfte. Ich stand aber bisher nicht vor dem Problem.

    Ja, für Bash gibt es nullglob:

    Zitat

    nullglob: If set, bash allows patterns which match no files (see Pathname Expansion) to expand to a null string, rather than themselves.

    Code
    /var/empty$ for x in *.mp4; do echo "verarbeite $x"; done
    verarbeite *.mp4
    /var/empty$ shopt -s nullglob
    /var/empty$ for x in *.mp4; do echo "verarbeite $x"; done


    Das funktioniert, weil for ohne in (bzw. in ohne Argumente) gültige Syntax ist.
    In diesem Fall sollte es nicht schaden, die Option für das ganze Skript zu setzen.

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Zwischendurch hat man mal die Hertha Fans im Olympiastadion gehört. Wohn ja nur ein paar km entfernt. Ist jetzt ruhiger geworden...

    Dito mit den FCN-Fans, die sich heute gegen 10 an der Wöhrder Wiese getroffen hatten und dann zum Stadion gezogen sind. Zum Glück gab es zur Ablenkung Füchse zu fangen…

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Was ist x? … was bedeutet artists[$artist]=x?

    Ein Dummy-Wert. Wie ich weiter getestet habe, reicht es selbst einen leeren String zu setzen.

    declare -A definiert ein assoziatives Array, in dem man Zeichenketten nicht nur unter beliebigen Ganzzahlen, sondern Zeichenketten ablegen kann. Das wird hier genutzt, um Künstler nur genau einmal im Array abzulegen, wenngleich als Schlüssel und nicht als Wert (der einfach überschrieben wird, wenn ein Künstler mehrfach abgelegt wird).
    Ein solches Array wird ungefähr so serialisiert:

    Code
    artists=(["Kein Künstler.mp4"]="x" ["Foo Bar"]="x" [Dude]="x" )

    ${!artists[@]} ist die Syntax, um alle Schlüssel eines Arrays zu erhalten (wieder in Anführungszeichen, damit Leerzeichen keine Wörter auftrennen).


    alle Künstler genau einmal in einem Bash-Array abzulegen ist auch nicht ganz trivial

    Die Funktionalität, die gandro seinerseits zu Farbe hingerissen hat, macht es möglich – jede Hashtabelle ist auch ein Set.

    gandro
    24. Februar 2009 um 11:07


    (Haben Macs immer noch bash 3.2 als letzte GPLv2-Version, nachdem alle Skriptsprachen herausgeschmissen und zsh zum Standard gemacht wurde?)
    Wohlgemerkt passt das trotzdem nicht mehr gescheit auf eine Zeile.


    Leerzeichen im Dateinamen sollten doch eigentlich kein Problem sein, weil ich als Trenner ja sowieso " - " nutze. (Also Leerzeichen Bindestrich Leerzeichen). Ich weiß halt offengestanden nicht mal wirklich wie ich die Frage formulieren soll.

    Keine Ahnung wie deine Dateinamen aussehen, aber die Schleife stolpert trotzdem über alle anderen Leerzeichen (zumindest vor dem Bindestrich, falls vorhanden) im Namen.
    Aus einem Verzeichnis mit dem Inhalt

    Zitat

    Dude - bla.mp4
    Foo Bar - Baz.mp4
    Kein Künstler.mp4


    macht deine Schleife mit dem standardmäßigen Worttrenner IFS (enthält Leerzeichen, Tabulator, Zeilenumbruch) folgende Zuweisungen an die Variable i:

    Zitat

    Dude
    Foo
    Bar
    Kein
    Künstler.mp4

    Sowohl für die Schleifenliste als auch den -inhalt (wenn du nicht "$i" statt $i schreiben willst) musst du den Worttrenner daher vorübergehend abschwächen. Mit sort -u bekommst du Duplikate für den gleichen Künstler entfernt:

    Code
    ORIG_IFS=$IFS; IFS=$'\n'; for i in $(find . -type f -name "*.mp4" -printf "%f\n" | awk -F ' - ' '{print $1}' | sort -u); do cp -v $i* /mnt/apex01/pfad/zum/Ziel/$i/; done; IFS=$ORIG_IFS; unset ORIG_IFS

    Diese Befehlszeile kann keine Dateien ohne Künstler kopieren (wegen dem Schrägstrich am Ende des cp-Befehls) und legt nach wie vor keine Zielverzeichnisse an.
    Das Gefrickel mit IFS lässt sich in diesem Fall auch nicht mit find … -print0 | xargs -0 … vermeiden, da xargs keine Subshell ausführen kann.

    Eine weitere Lösung, die nur dateiweise kopiert (alle Künstler genau einmal in einem Bash-Array abzulegen ist auch nicht ganz trivial), aber dafür ganz ohne find/awk auskommt:

    Code
    for i in *.mp4; do artist=${i%% - *}; if [[ $artist != $i ]]; then mkdir -p /mnt/apex01/pfad/zum/Ziel/"$artist" && cp -v "$i" /mnt/apex01/pfad/zum/Ziel/"$artist"; else cp -v "$i" /mnt/apex01/pfad/zum/Ziel/; fi; done


    Damit hab ich derzeit folgende Probleme:
    - trotz dem -v Schalter bekomme ich keine Ausgabe.
    - Gelegentlich läuft sich der Mist tot und muss von Hand via Ctrl+C gestoppt werden. Insbesondere wenn während des Kopiervorgangs Dateien hinzukommen od. wenn der Zielordner nicht vorhanden ist.

    Ich fürchte, das kann man nicht ganz so einfach reparieren. Mit Anführungszeichen kann man die Shell davon abhalten, Dateinamen mit Leerzeichen aufzuteilen, aber dann scheitert es trotzdem an Künstlern mit Leerzeichen bzw. Dateien ohne Künstler.

    Man kann es etwas verbessern, wenn man der Shell mitteilt, dass nur Zeilenende als Worttrenner zu nutzen ist. Trotzdem wird bei einem Künstler mit X Dateien jede X-mal kopiert.

    Code
    $ IFS=$'\n'; for i in $(ls | awk -F ' - ' '{print $1}'); do echo cp -v "$i"* "/zielverzeichnis/$i" ; done; IFS=$' \t\n'
    cp -v aaah.doc /zielverzeichnis/aaah.doc
    cp -v foo - bar.mp3 /zielverzeichnis/foo
    cp -v kein künstler.xlsx /zielverzeichnis/kein künstler.xlsx
    cp -v test fighters - bla bla.mp3 test fighters - blub.mp3 /zielverzeichnis/test fighters
    cp -v test fighters - bla bla.mp3 test fighters - blub.mp3 /zielverzeichnis/test fighters

    Wenn man schon awk nutzt, kann man damit natürlich ein kleines Programm schreiben, hier zur Verdeutlichung über mehrere Zeilen (wie in Shell- oder Javascript-Syntax beendet entweder ein Semikolon oder eine neue Zeile einen Befehl). Die erzeugten Shell-Befehle werden tatsächlich ausgeführt, wenn man die gesamte Befehlszeile in eval $( ... ) steckt.

    Das könnte man nun noch weiter ausbauen, etwa durch ein zusätzliches

    Code
    print "mkdir -p \"" target "\""


    oder indem man install statt cp missbraucht.


    Last Christmas, you played me this song
    And the very next day, you played it again
    This year, to spare me my ears
    I'm plugging them up with seashells

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Mit VGA kommt die mit meinen Full-HD-Fernseher klar, was mich schon etwas wundert.

    Ein RAMDAC, der einen professionellen Röhrenbildschirm mit 1600×1200 oder mehr (John Carmacks 28-Zoll-Arbeitsgerät lief angeblich auf 2048×1152) bei vernünftiger Bildwiederholrate ansteuern kann, sollte schon rein rechnerisch kein Problem mit 1920×1080 bei nur 60 Hz haben.
    Nicht umsonst haben Flachbildfernseher ihren Ursprung in der Computer-Branche.


    Es geht nicht darum, den 1920×1200-Monitor gewaltsam mit der Ati Radeon 9200 AGP zu vereinen

    Es ging mir auch nur darum behilflich zu sein herauszufinden, ob es sich tatsächlich um genau diese Einschränkung der Hardware handelt, die sich meist darin niederschlägt dass hohe Auflösungen erst gar nicht zur Verfügung stehen, oder eher einen Defekt oder einen Defizit der Software.
    Wie Dirk sagt ist letzteres unwahrscheinlich, solange der Kernel auch keine Meldungen ausgibt, wenn das Bild flackert.

    Im IRC wurde mir seinerseits mitgeteilt, dass bezüglich DVI-Anbindung die Digitalausgabe vieler AGP-Grafikkarten hinter der Bandbreite, die ein einzelner DVI-Link bzw. HDMI <1.3 zu leisten vermag, deutlich hinterherhängt. Mit einer ATI Radeon 9000 Pro (eigentlich Sparversion der 8500) hatte ich da eigentlich keine Probleme 1920×1080@60 zu betreiben, wohl aber eine Nvidia GeForce 4 Ti 4200 die nur genügend Leistung über den VGA-DAC bot.
    Mit einem ausreichend geschirmten Kabel ist 1920×1200 testweise auch über VGA zu ertragen, falls das ausgeschlossen werden soll.