Dateien aus einer Liste mit rsync kopieren

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Dateien aus einer Liste mit rsync kopieren

Beitrag von Richard » 17.11.2016 13:10:22

Hallo,

da leider cp keine Möglichkeit hat Dateien aus einer Textdatei zu kopieren, habe ich dafür rysnc getestet. Folgendes Szenario: Ich habe meien Musik in einem Ordner "MP3" sortiert, diese wird 1:1 auf einen USB-Stick kopiert fürs Auto. Das passiert mit dem Tool FreeFileSync. Dazu habe ich eine Textdatei im Ordner MP3 liegen mit den absoluten Pfaden zu bestimmten Liedern die quer verstreut in den Unterordnern von MP3 liegen - ohne jedes Schema. Diese sollen in einem speziellen Ordner auf den Stick kopiert werden, eien Art "Richards Favorits". Ich habe das hier versucht

Code: Alles auswählen

rsync -av --files-from=text.txt / /media/ntfs/mp3/test
da schreibt er aber auch die ganze Ordnerstruktur mit, das soll so nicht sein. Alle Dateien in der Liste sollen einfach in den Ordner liegen. Wie mach ich das? Ich habe hier https://wiki.ubuntuusers.de/rsync/#Vorab-zur-Syntax die Hinweise zu den Slashes gelesen, das scheint aber nicht das Problem zu sein. Den Slash zwischen Textdatei und Ziel wegzulassen bewirkt nur, dass gar nichts mehr passiert. Ein Fehler kommt da nicht, nur die RSync-Syntax. Was mach ich falsch?

Richard

P.S. FreeFileSync bietet keine Möglichkeit so zu sichern - zumindest bisher keine gefunden. Meine Übergangslösung ist, dass ich die Textfile durch 'cp' ergänzt habe, statt einer Dateiliste hab ich dort also eine Befehlsliste.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von smutbert » 17.11.2016 13:36:57

würde so etwas nicht vielleicht genügen

Code: Alles auswählen

cp -u $(cat text.txt) /media/ntfs/mp3/test/

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von Richard » 17.11.2016 14:05:18

Grundsätzlich wäre mir das auch recht, nur kommt da

Code: Alles auswählen

cp: Aufruf von stat für '/media/ntfs/mp3/ordner1/dateiname mit leerzeichen.mp3'$'\r\n''/media/ntfs/mp3/ordner2/zweiter dateiname mit leerzeichen.mp3'$'\r\n''/media/ntfs/mp3/ordner3/dritter dateiname mit leerzeichen.m4a' nicht möglich: Datei oder Verzeichnis nicht gefunden
Es geht aber wenn ich nur eine Datei in der Liste habe. Ich vermute, er interpretiert nicht jede Zeile als eigene Zeile, sondern alles als eins. Wenn ich alle 62 Zeilen drin habe kommt die Meldung der Dateiname sei zu lang.

Der Aufruf erfolgt so (ich habe die "" ergänzt wegen der Leerzeichen):

Code: Alles auswählen

cp -u "$(cat text.txt)" /media/ntfs/mp3/test/
Bevor man aber jetzt beginnt die Textdatei zurechtzufummeln wäre nicht doch rsync die bessere Option? Dort scheint der Support für Dateien aus einer Liste enthalten zu sein.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von smutbert » 17.11.2016 14:36:28

Ah. ok Leerzeichen - nicht daran gedacht :facepalm:

"$(cat text.txt)" geht nicht, weil dann die ganze Ausgabe als ein einziger Dateiname interpretiert wird, aber mit einer Schleife sollte es klappen (ungefähr, habs nicht ausprobiert)

Code: Alles auswählen

#!/bin/bash
IFS=$'\n'
for i in $(cat text.txt); do
    cp -u "$i" /media/ntfs/mp3/test/
done
oder man könnte auch die Ausgabe von cat um die Anführungsstriche bei den Zeilenumbrüchen ergänzen, aber ich schreib jetzt besser nichts mehr, weil da bestimmt noch bessere Vorschläge kommen...

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von Richard » 17.11.2016 15:14:08

Geht leider auch noch nicht so ganz, immerhin interpretiert er jetzt jede Zeile einzeln. Es kommt diese Fehlermeldung (für jede Zeile):

Code: Alles auswählen

cp: Aufruf von stat für '/media/ntfs/mp3/datei mit leerzeichen.mp3'$'\r' nicht möglich: Datei oder Verzeichnis nicht gefunden
\r ist wohl ein Formatierungszeichen (Wagenrücklauf), wieso da jetzt ein $ drin steht versteh ich nicht.

Was macht denn das IFS? ich hab das in ähnlichen Zusammenhängen in anderen Skripten gefunden, aber nicht was es tut.
Zuletzt geändert von Richard am 17.11.2016 16:25:36, insgesamt 3-mal geändert.

uname
Beiträge: 12075
Registriert: 03.06.2008 09:33:02

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von uname » 17.11.2016 15:14:39

Offtopic:

Geht doch bestimmt auch ohne cat, oder?
https://www.socallinuxexpo.org/scale5x/ ... aumann.pdf

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von smutbert » 17.11.2016 16:58:15

IFS steht für internal field separator. Im Beispiel habe ich IFS auf einen Zeilenumbruch gesetzt, damit in der for-Schleife jede Zeile als ein Element gehandhabt wird.

Mit $'\r' wird der Wagenrücklauf dargestellt. Es handelt sich also um eine Textdatei mit Zeilenumbrüchen nach Windows/DOS-Art. Immerhin wird man so das laut uname überflüssige cat los :mrgreen:

Code: Alles auswählen

#!/bin/bash
IFS=$'\n'
for i in $(sed 's/.$//' text.txt); do
    cp -u "$i" /media/ntfs/mp3/test/
done
Alternativ müsste man statt LF auch CR+LF als Trennzeichen (IFS) definieren können (aber dann würde ich wieder beim überflüssigen cat anstehen)

Benutzeravatar
Dogge
Beiträge: 1895
Registriert: 13.09.2010 11:07:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von Dogge » 17.11.2016 18:20:31

-R, --relative use relative path names
--no-relative turn off --relative
--no-implied-dirs don’t send implied dirs with -R


Geht vielleicht damit was?
Debian Testing + Gnome | Linux-Anfänger seit 04/2003
http://files.mdosch.de/2014-07/0xE13D657D.asc

tobo
Beiträge: 1996
Registriert: 10.12.2008 10:51:41

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von tobo » 17.11.2016 20:00:46

Was das rsync angeht, da könntest du die Dateien in der Form

Code: Alles auswählen

/pfad/pfad/pfad/./dateiname.dateiendung
mit einem Einschub von ./ vor dem Dateinamen angeben. Legt dann die Dateien ohne den Pfad ab.

Ansonsten ist mir immer noch nicht ganz klar, was da jetzt genau für Zeilenenden in der Datei drinstehen (od -c)!? Ich könnte mir vorstellen, dass sowas hier funktioniert:

Code: Alles auswählen

while read i;do cp -u "$i"/media/ntfs/mp3/test/;done < <(<text.txt tr "\r" "\n")

Richard
Beiträge: 639
Registriert: 11.10.2012 14:18:37
Lizenz eigener Beiträge: GNU General Public License

Re: Dateien aus einer Liste mit rsync kopieren

Beitrag von Richard » 18.11.2016 17:24:03

Mit $'\r' wird der Wagenrücklauf dargestellt. Es handelt sich also um eine Textdatei mit Zeilenumbrüchen nach Windows/DOS-Art.
Die Textdatei wurde unter Linux erstellt, aber der Inhalt aus einer unter Windows erstellten Datei reinkopiert (hier wurde Notepad++ genutzt und da hatte ich auf 'Linux-Format' umgestellt; ich konnte so jetzt Linux-Konfigurationsdatei auch bequem von Windows aus per Notepad++ ändern ohne Probleme unter Linux zu bekommen).

Ich hab es jetzt so gelöst mit rsync

Code: Alles auswählen

rsync -avR --no-relative --files-from=/media/ntfs/mp3/text.txt ./ /media/ntfs/test/
Musste aber noch die Textdatei anpassen und die dort angegebenen Pfade ändern. Es dürfen nur die Ordner im Pfad stehen ab dem Ordner in dem das Rsync-Skript liegt. Liegt es in /media/ntfs/mp3 dürfen diese 3 Ordner im Pfad in der Textdatei nicht drin stehen, da beginnen die Pfade bei /unterordner1/unterordner2/.... Sonst kommt eine Fehlermeldung, dass die Datei
/media/ntfs/mp3/media/ntfs/mp3/unterordner1/unterordner2/datei.mp3
nicht gefunden werden könnte.

Antworten