Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Der Linux Problem/Fragen-Thread
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #1681
RE: Der Linux Problem/Fragen-Thread
(14.12.2022 23:11)tk1908 schrieb:  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.
Code:
$ 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

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.
Code:
$ 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/"

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.

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
(Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2022 00:49 von DosAmp.)
15.12.2022 00:46
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
tk1908 Offline
Unixer

Beiträge: 7.353
Registriert seit: Apr 2009
Beitrag #1682
RE: Der Linux Problem/Fragen-Thread
Okay, ich komme nicht mehr mit. 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.

Könnte man, um von ls wegzukommen, nicht auch auf find zurückgreifen? Also sowas hier in der Art:

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

[Bild: Rz3JNLI.gif]
Meine Beiträge stehen unter der MIT-Lizenz:D

(09.04.2016 13:26)tk1908 schrieb:  externe HDD am Router? Klar ich tausch mein Auto gegen nen Tretroller mit Bremsklotz.
(Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2022 11:32 von tk1908.)
15.12.2022 09:08
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #1683
RE: Der Linux Problem/Fragen-Thread
(15.12.2022 09:08)tk1908 schrieb:  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

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
15.12.2022 13:24
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
tk1908 Offline
Unixer

Beiträge: 7.353
Registriert seit: Apr 2009
Beitrag #1684
RE: Der Linux Problem/Fragen-Thread
Also erstmal Danke für die Hilfe DosAmp.

Dateinamen sind immer nach folgendem Schema aufgebaut:

- Artist - Titel

Gelegentlich habe ich aber auch, Artist.Titel, die werden aber derzeit mit ner anderen Routine weggeschoben, wobei sich hier das selbe Problem ergibt, da ich dort immer folgenden String verwendet habe:

Code:
for i in $(ls | awk -F '.' '{print $1}'); do cp -v $i* /mnt/apex01/verzeichnis/zum/Ziel/$i |tee >>/home/tkoehler/cp.log; done

Also wie vorher, nur halt mit dem ersten Punkt des Dateinamens als Trennzeichen.

Ich gebe offen zu, dass mein Wissen hierzu leider noch sehr lückenhaft ist, bin aber generell offen für Vorschläge.

[Bild: Rz3JNLI.gif]
Meine Beiträge stehen unter der MIT-Lizenz:D

(09.04.2016 13:26)tk1908 schrieb:  externe HDD am Router? Klar ich tausch mein Auto gegen nen Tretroller mit Bremsklotz.
(Dieser Beitrag wurde zuletzt bearbeitet: 15.12.2022 14:07 von tk1908.)
15.12.2022 14:05
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #1685
RE: Der Linux Problem/Fragen-Thread
(15.12.2022 13:24)DosAmp schrieb:  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.
Code:
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

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
15.12.2022 19:14
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
tk1908 Offline
Unixer

Beiträge: 7.353
Registriert seit: Apr 2009
Beitrag #1686
RE: Der Linux Problem/Fragen-Thread
Sorry ich verstehe es nicht. Was ist x? Okay artist=${i%% - *} behandelt den ersten Fall, den ich genannt habe und artist=${i%%.*.mp4} den zweiten. Aber was bedeutet artists[$artist]=x?

[Bild: Rz3JNLI.gif]
Meine Beiträge stehen unter der MIT-Lizenz:D

(09.04.2016 13:26)tk1908 schrieb:  externe HDD am Router? Klar ich tausch mein Auto gegen nen Tretroller mit Bremsklotz.
15.12.2022 20:25
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
DosAmp Offline
Anderes Zeigegerät

Beiträge: 12.219
Registriert seit: Jul 2008
Beitrag #1687
RE: Der Linux Problem/Fragen-Thread
(15.12.2022 20:25)tk1908 schrieb:  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).

CCITTグループ4またはZIP圧縮のモノクロ300dpiで最高の再現性
15.12.2022 22:45
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Dirk Offline
Software Archäologe

Beiträge: 14.721
Registriert seit: Jul 2008
Beitrag #1688
RE: Der Linux Problem/Fragen-Thread
Hab mal was ganz spezielles. In den letzten Jahren hatte ich mal nen Linux (Ubuntu Derivat?) da gabs ne Spielesammlung bei. Unter anderem ein Spiel wo es Minessweeper Mäßig darum ging Linien zwischen Zahlen zu ziehen. Weiß jemand wie das heißt, oder die Spielesammlung?

09.03.2023 10:30
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Dirk Offline
Software Archäologe

Beiträge: 14.721
Registriert seit: Jul 2008
Beitrag #1689
RE: Der Linux Problem/Fragen-Thread
Die Antwort wäre Bridges gewesen. Gibts auch unter Android in der 40 Puzzle Games Sammlung, die wohl auch unter Linux existiert

14.03.2023 12:58
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Gelöschter Beitrag von Xaar
Dirk Offline
Software Archäologe

Beiträge: 14.721
Registriert seit: Jul 2008
Beitrag #1690
RE: Der Linux Problem/Fragen-Thread
Wie kann man eigentlich schauen, wo der Speicherplatz unter Linux hingeht? Habe im Rechner um die 50 GB belegt - und keine Ahnung mit was. Das Home ist glaube ich nicht das Problem. Letzte Woche hatte ich um die 30 GB Gelöscht, die durch nen schiefgegangenden Timestamp Instanz belegt waren. Paketmanager zeigt mir zwar an, was installiert ist, aber nicht was.

Mir fehlt ein wenig die Systembereinigung von Windows. Die kübelt ja auch gerne das unnütze Zeug von Updates & Co mal weg.

22.05.2023 06:33
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste