paulheinz
Anmeldungsdatum: 7. Januar 2019
Beiträge: 35
Wohnort: Rostock
|
Hallo und guten Tag, im Verzeichnis /home/user/Downloads/ liegen beliebig viele Dateien mit folgender Namensstruktur: 20210430181138_A.txt 20210430170759_A.txt 20210430170746_A.txt … Die anfänglichen vierzehn Ziffern (= Zahlenwert) des Dateinamens ändern sich ständig. Sie geben die Zeit wieder, in der die Dateien erstellt wurden. Der Rest soll stets unverändert bleiben. Per Terminal bzw. per Shell soll die Datei mit dem geringsten Zahlenwert aus dem Verzeichnis /home/user/Downloads/ in das Verzeichnis /home/user/Daten/ verschoben werden. Auch soll diese dann aus dem ursprünglichen Verzeichnis verschwinden. Wie geht das? Viele Dank für die Hilfe!
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4378
Wohnort: Göttingen
|
Liegen dort nur diese Dateien oder können auch noch andere Dateien dort liegen? Also, wenn dort wirklich nur die Dateien dieser Form liegen, kannst Du das z.B. so machen:
cd /home/user/Downloads/
ls | head -1 | xargs -rI{} mv {} /home/user/Daten/
|
paulheinz
(Themenstarter)
Anmeldungsdatum: 7. Januar 2019
Beiträge: 35
Wohnort: Rostock
|
Doc_Symbiosis schrieb: Liegen dort nur diese Dateien oder können auch noch andere Dateien dort liegen? Also, wenn dort wirklich nur die Dateien dieser Form liegen, kannst Du das z.B. so machen:
cd /home/user/Downloads/
ls | head -1 | xargs -rI{} mv {} /home/user/Daten/
Du hast recht, es können auch andere Dateien vorliegen. Aber es geht ausschließlich um die beschriebenen Dateien. Die anderen sollen ignoriert werden.
|
Doc_Symbiosis
Anmeldungsdatum: 11. Oktober 2006
Beiträge: 4378
Wohnort: Göttingen
|
Naja, dann wäre das Hauptproblem, die betroffenen Dateien zu identifzieren.
Wäre da ein 202*_A.txt ausreichend?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Eine Möglichkeit wäre find zu nutzen:
| origin="/home/user/Downloads/"
destination="/home/user/Daten/"
find "$origin" -maxdepth 1 -type f -regextype posix-egrep -regex ".*/202[[:digit:]]{11}_.+\.txt" -exec mv -t "$destination" {} +
|
|
paulheinz
(Themenstarter)
Anmeldungsdatum: 7. Januar 2019
Beiträge: 35
Wohnort: Rostock
|
Doc_Symbiosis schrieb: Naja, dann wäre das Hauptproblem, die betroffenen Dateien zu identifzieren.
Wäre da ein 202*_A.txt ausreichend?
Ich werde der Einfachheit halber hierzu ein neues Verzeichnis erstellen. Statt /home/user/Downloads nehme ich /home/user/Downloads_URL. Damit funktioniert Dein Vorschlag störfrei. Danke für Deine Mühe.
|
paulheinz
(Themenstarter)
Anmeldungsdatum: 7. Januar 2019
Beiträge: 35
Wohnort: Rostock
|
seahawk1986 schrieb: Eine Möglichkeit wäre find zu nutzen:
| origin="/home/user/Downloads/"
destination="/home/user/Daten/"
find "$origin" -maxdepth 1 -type f -regextype posix-egrep -regex ".*/202[[:digit:]]{11}_.+\.txt" -exec mv -t "$destination" {} +
|
Ich habe Deinen Vorschlag ausprobiert. Leider werden dabei alle Dateien nach destination kopiert. Das Weglassen von -maxdepth 1 und das Variieren in ".*/202digit]{11}_.+\.txt" war leider auch ohne Erfolg. Macht es Dir etwas aus, noch einmal über Deine Zeilen zu schau'n? Vielen Dank!
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Kannst du bitte mal ein Beispiel dafür zeigen, welche Dateien ungewollt erfasst werden (z.B. mal den Teil mit dem -exec weglassen)? Mit mv werden Dateien immer verschoben, nicht kopiert.
|
paulheinz
(Themenstarter)
Anmeldungsdatum: 7. Januar 2019
Beiträge: 35
Wohnort: Rostock
|
seahawk1986 schrieb: Kannst du bitte mal ein Beispiel dafür zeigen, welche Dateien ungewollt erfasst werden (z.B. mal den Teil mit dem -exec weglassen)? Mit mv werden Dateien immer verschoben, nicht kopiert.
Du hast recht, ich habe mich falsch ausgedrückt: Mit "kopieren" meinte ich "verschieben". Es werden alle Dateien, also die Dateien 20210430181138_A.txt, 20210430170759_A.txt und 20210430170746_A.txt von origin nach destination verschoben. Gesucht, gefunden und verschoben werden soll aber nur die Datei mit dem kleinsten Zahlenwert.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Ah ok da soll noch sortiert und selektiert werden - das sollte z.B. so gehen:
| find "$origin" -maxdepth 1 -type f -regextype posix-egrep -regex ".*/202[[:digit:]]{11}_.+\.txt" -print0 | sort -nz | head -z -n1 | xargs -0 -I{} mv -t "$destination" {}
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Nun, wenn Du keine Datei dabei hast, die Leerzeichen oder ähnliches im Namen hat, und die Sortierung kaputt macht, dann ist das einfachste Kommando wohl: | cd /home/user/Downloads
mv $(ls 20[0-9]*_A.txt | sort -n | head -1) /home/user/Daten/
|
Vorraussetzung wäre, dass alle Dateien, die mit 20[Ziffer] beginnen und mit _A.txt enden auch dem Muster, also der Länge der Zahlenfolge, entsprechen, und Du solltest einen cronjob einrichten, der Dich vor 2100-01-01 daran erinnert, das Script upzudaten. 😉
|
paulheinz
(Themenstarter)
Anmeldungsdatum: 7. Januar 2019
Beiträge: 35
Wohnort: Rostock
|
seahawk1986 schrieb: Ah ok da soll noch sortiert und selektiert werden - das sollte z.B. so gehen:
| find "$origin" -maxdepth 1 -type f -regextype posix-egrep -regex ".*/202[[:digit:]]{11}_.+\.txt" -print0 | sort -nz | head -z -n1 | xargs -0 -I{} mv -t "$destination" {}
|
Vielen Dank! Es funktioniert!
|
paulheinz
(Themenstarter)
Anmeldungsdatum: 7. Januar 2019
Beiträge: 35
Wohnort: Rostock
|
Doc_Symbiosis schrieb: Liegen dort nur diese Dateien oder können auch noch andere Dateien dort liegen? Also, wenn dort wirklich nur die Dateien dieser Form liegen, kannst Du das z.B. so machen:
cd /home/user/Downloads/
ls | head -1 | xargs -rI{} mv {} /home/user/Daten/
Danke!!! Unter Deiner Prämisse, ausschließlich die benannte Dateinamenstruktur liegen vor, funktioniert Dein Vorschlag.
|
paulheinz
(Themenstarter)
Anmeldungsdatum: 7. Januar 2019
Beiträge: 35
Wohnort: Rostock
|
user_unknown schrieb: Nun, wenn Du keine Datei dabei hast, die Leerzeichen oder ähnliches im Namen hat, und die Sortierung kaputt macht, dann ist das einfachste Kommando wohl: | cd /home/user/Downloads
mv $(ls 20[0-9]*_A.txt | sort -n | head -1) /home/user/Daten/
|
Vorraussetzung wäre, dass alle Dateien, die mit 20[Ziffer] beginnen und mit _A.txt enden auch dem Muster, also der Länge der Zahlenfolge, entsprechen, und Du solltest einen cronjob einrichten, der Dich vor 2100-01-01 daran erinnert, das Script upzudaten. 😉
Vielen Dank! Es funktioniert!
|