Thinkpad T470s, als Dual-Boot mit hackOS Linux angedacht.
Vielleicht versuche ich mal am Upgrade auf Windows 11, der Unterschied zwischen Kaby Lake und Kaby Lake Refresh als Mindestanforderung für das Upgrade sollte auch in Zukunft minimal sein.
Thinkpad T470s, als Dual-Boot mit hackOS Linux angedacht.
Vielleicht versuche ich mal am Upgrade auf Windows 11, der Unterschied zwischen Kaby Lake und Kaby Lake Refresh als Mindestanforderung für das Upgrade sollte auch in Zukunft minimal sein.
Leider gibt es auch keine einfachen "eingebauten" Alternativen. WSL1 unterstützt serielle Ports, aber kein PPP. WSL2 und Hyper-V unterstützen keine seriellen Ports, nur in die VM weitergeleitete USB-Adapter. Nur "volle" Lösungen wie VirtualBox mit einem kleinen Linux-Gastsystem unterstützen sowohl serielle Ports und Netzwerkbrücke, aber das ist dann gefühlt nur die Sparversion zu einem Raspberry Pi mit Spannungswandler.
Auch Thinkpad X230:
Blinding Lights, but it sounds like Sonic the Hedgehog und ein paar andere alternative Einspielungen von Pete Frogs.
mein gott, haben die das echt erst hin gebogen, als es schon direkt zu spät dafür war und DOS unter windows ein auslaufmodell war?
Einfache DOS-Anwendungen (d. h. in der Regel frühe portierte CP/M-Programme), die ausschließlich DOS-APIs genutzt haben, um Text auszugeben, konnten bereits unter der ersten Version von Windows im Fenster laufen. Aber alles, was aus Performance-Gründen direkt auf den Videospeicher im Text- oder Grafikmodus zugegriffen hat, ließ sich erst mit dem Virtual 8086 Mode im 80386 sinnvoll abgreifen und umbiegen.
Nicht umsonst wurde der 80286 als "hirnloser Chip" bezeichnet, dessen Protected Mode nicht auf DOS, sondern auf zukunftsweisende Betriebssysteme wie OS/2 oder Xenix zugeschnitten ist und der ohne eine externe Reset-Schaltung, wie sie IBM in den PC/AT einbaute, oder schmutzige Programmiertricks nicht verlassen werden kann.
Paul Anka – Smells Like Teen Spirit
https://www.youtube.com/watch?v=Y4NCU1cmIkk
cmdline.txt ist irrelevant, diese Datei wird nur vom Raspberry-Pi-Bootlader für die Kernel-Parameter benutzt, du bootest aber auf einem ganz anderen ARM-Gerät über UEFI.
Wie angegeben wird root=/dev/mmcblk0p2 erst funktionieren, nachdem du die eMMC eingerichtet hast. Der dritte Bus ist hingegen fürs WLAN.
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:
Zitatnullglob: If set, bash allows patterns which match no files (see Pathname Expansion) to expand to a null string, rather than themselves.
/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.
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…
dosamp?
Mein Omnibook mit den Thinkpad-600E-Treibern als auch mein kleines Portege nutz(t)en leider nur Standard-4:3-Auflösungen.
Wie man recht gut an der Streckung erahnen kann, ist das nicht nur eine Sache der virtuellen Auflösung.
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:
${!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.
(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.
declare -A artists
for i in *.mp4; do
artist=${i%% - *} # ; artist=${i%%.*.mp4}
artists[$artist]=x
done
for i in "${!artists[@]}"; do
if [[ $i != *.mp4 ]]; then
mkdir -p /mnt/apex01/pfad/zum/Ziel/"$i" && cp -v "$i"* /mnt/apex01/pfad/zum/Ziel/"$i"/
else
cp -v "$i" /mnt/apex01/pfad/zum/Ziel/
fi
done
Alles anzeigen
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
ZitatDude - 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:
ZitatDude
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:
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:
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.
$ ls -1
aaah.doc
'foo - bar.mp3'
'kein künstler.xlsx'
'test fighters - bla bla.mp3'
'test fighters - blub.mp3'
$ for i in $(ls | awk -F ' - ' '{print $1}'); do echo cp -v "$i"* "/zielverzeichnis/$i" ; done
cp -v aaah.doc /zielverzeichnis/aaah.doc
cp -v foo - bar.mp3 /zielverzeichnis/foo
cp -v test fighters - bla bla.mp3 test fighters - blub.mp3 /zielverzeichnis/test
cp -v fighters* /zielverzeichnis/fighters
cp -v test fighters - bla bla.mp3 test fighters - blub.mp3 /zielverzeichnis/test
cp -v fighters* /zielverzeichnis/fighters
Alles anzeigen
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.
$ 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.
$ find -maxdepth 1 -type f -printf "%f\n" | \
awk -v "destdir=/zielverzeichnis" -F ' - ' '{
filename=$0
if (NF > 1) { subdir="/" $1 }
else { subdir="" }
target=destdir subdir "/"
print "cp -v \"" filename "\" \"" target "\"" }'
cp -v "test fighters - bla bla.mp3" "/zielverzeichnis/test fighters/"
cp -v "kein künstler.xlsx" "/zielverzeichnis/"
cp -v "test fighters - blub.mp3" "/zielverzeichnis/test fighters/"
cp -v "aaah.doc" "/zielverzeichnis/"
cp -v "foo - bar.mp3" "/zielverzeichnis/foo/"
Alles anzeigen
Das könnte man nun noch weiter ausbauen, etwa durch ein zusätzliches
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