(gelöst) Dateien rekursiv verschieben?

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
Antworten
guennid

(gelöst) Dateien rekursiv verschieben?

Beitrag von guennid » 14.12.2018 07:56:13

Das Programm musescore pflegt ein, wie ich finde, recht apartes procedere, Sicherheitskopien betreffend. Die normale Dateiendung für Partituren ist mscz. Bei jeder Änderung einer solchen Datei legt musescore im selben Verzeichnis eine Sicherungskopie mit

Code: Alles auswählen

.*.mscz,
an, womit die gängige Gepflogenheit, "versteckte" Dateien im Alltagsbetrieb im Dateimanager auszublenden, nach meinem Geschmack ad absurdum geführt wird.

Wie man diese Sicherungskopien rekursiv, also aus einem Verzeichnis und seinen sämtlichen Unterverzeichnissen, via shell-Befehl löschen könnte, glaube ich zu wissen. Frage: Geht das auch mit rekursivem Verschieben in ein gesondertes Verzeichnis? Betrachte ich die Parameter für mv in der manpage, dann geht's mit mv offenbar nicht.

Grüße, Günther
Zuletzt geändert von guennid am 15.12.2018 07:03:20, insgesamt 1-mal geändert.

Benutzeravatar
MSfree
Beiträge: 10741
Registriert: 25.09.2007 19:59:30

Re: Dateien rekursiv verschieben?

Beitrag von MSfree » 14.12.2018 08:19:22

guennid hat geschrieben: ↑ zum Beitrag ↑
14.12.2018 07:56:13
Geht das auch mit rekursivem Verschieben in ein gesondertes Verzeichnis?
Willst du dabei die Verzeichnisstruktur beibehalten oder reicht es, alle Dateien in ein einziges Verzeichnis zu schieben?

guennid

Re: Dateien rekursiv verschieben?

Beitrag von guennid » 14.12.2018 08:49:47

Letzteres reicht nicht nur, sondern ist erwünscht. Ich weiß auch nicht, warum die Programmersteller dem Benutzer zumuten, gefühlte 80 000 Verzeichnisse auf der Suche nach versteckten(!) (überflüssigen) Sicherungskopien durchforsten zu müssen. :wink:

Wahrscheinlich werden dabei gleichnamige Dateien überschrieben, ist mir aber egal. Das Allermeiste wird für mich eh nur Müll darstellen.

Grüße, Günther

Benutzeravatar
MSfree
Beiträge: 10741
Registriert: 25.09.2007 19:59:30

Re: Dateien rekursiv verschieben?

Beitrag von MSfree » 14.12.2018 09:02:51

guennid hat geschrieben: ↑ zum Beitrag ↑
14.12.2018 08:49:47
Letzteres reicht nicht nur, sondern ist erwünscht.
In dem Fall würde ich find bemühen:

Code: Alles auswählen

find . -name .\*.mscz,
listet dir alle Dateien nach dem von dir genannten Schema auf.

mit

Code: Alles auswählen

-exec ...
in der find-Parameterliste kannst du pro gefundenem Ergebnis ein Programm starten. Zum Verschieben also sowas

Code: Alles auswählen

-exec mv {} Zielverzeichnis \;
Der komplette Befehl wäre also

Code: Alles auswählen

find . -name .\*.mscz, -exec mv {} Zielverzeichnis \;
Ich lasse bei find ... -exec... meistens erstmal einen Blindlauf ohne -exec laufen, um sicherzustellen, daß wirklich nur die gewollten Dateien aufgelistet werden. :wink:

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Dateien rekursiv verschieben?

Beitrag von heisenberg » 14.12.2018 10:00:12

Noch eine geringfügig andere Variante:

Code: Alles auswählen

find /pfad -name ".*.mscz" -exec mv --target-directory=/dein/ziel/verzeichnis "{}" +
Da wird der mv mit maximal möglicher Anzahl von Argumenten aufgerufen, d. h. da sind weniger Prozessaufrufe, als bei der anderen Variante, die mv 1 x pro gefundener Datei aufruft.

Für alle Neulinge, die das lesen: Man beachte zusätzlich das gequotete "{}", um Probleme mit Leerzeichen im Dateinamen zu vermeiden.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

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

Re: Dateien rekursiv verschieben?

Beitrag von tobo » 14.12.2018 12:45:36

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.12.2018 10:00:12
Für alle Neulinge, die das lesen: Man beachte zusätzlich das gequotete "{}", um Probleme mit Leerzeichen im Dateinamen zu vermeiden.
Die Dateinamen werden von find beim {} grundsätzlich gequotet übergeben, da treten also niemals Fehler wegen Leerzeichen auf, sofern man nicht mit z.B. exec sh -c eine neue shell startet. Die gequoteten '{}' verwendet man, damit die Shell nicht die {} selbst interpretiert, und das hat meines Wissens nach wohl nur Relevanz in der Fish Shell!? Die interpretiert dann also {} zu irgendwas Speziellem und ich weiß auch nicht, ob dann "{}" ausreicht das zu unterbinden?! Da aber das '{}' grundsätzlich nicht schadet, kann man sich das generell überlegen beizubehalten...

guennid

Re: Dateien rekursiv verschieben?

Beitrag von guennid » 14.12.2018 14:04:26

Ich liebe diese Tastatur-bis-zum-geht-nicht-mehr-ausreiz-Syntax! :facepalm:

Ok, ich hab's nachgestellt. Beide Varianten funktionieren. Erst mal vielen Dank! :THX:

Jetzt wüsste ich gerne noch, was ich da gemacht habe: Über die Bedeutung folgender Zeichen in diesem Einzeiler bin ich mir unklar. Bleiben wir einstweilen bei MSFree:
1. die beiden unmittelbar einander folgenden Schweifklammern?
2. Backslash als vorletztes Zeichen?
3. Semikolon als letztes Zeichen?

Grüße, Günther

Benutzeravatar
MSfree
Beiträge: 10741
Registriert: 25.09.2007 19:59:30

Re: Dateien rekursiv verschieben?

Beitrag von MSfree » 14.12.2018 14:32:24

guennid hat geschrieben: ↑ zum Beitrag ↑
14.12.2018 14:04:26
1. die beiden unmittelbar einander folgenden Schweifklammern?
stehen symbolisch für jeden gefundenen Dateinamen, also als Platzhalter.
2. Backslash als vorletztes Zeichen?
3. Semikolon als letztes Zeichen?
In meinem Beispiel wird für jeden gefundenen Dateinamen der Befehl

Code: Alles auswählen

mv Dateiname Zielverzeichnis
an eine Shell übergeben. Um in einer Shell mehrere Befehle hintereinander auszuführen, muß man sie durch Semikolons abtrennen:

Code: Alles auswählen

mv Dateiname1 Zielverzeichnis; mv Dateiname2 Zielverzeichnis...
Der Backslash vor dem Semikolon ist nötig, damit die Shell, von der aus du den find-Befehl tippst, das Semikolon nicht selbst interprätiert, sondern als Parameter an find übergibt.

guennid

Re: Dateien rekursiv verschieben?

Beitrag von guennid » 14.12.2018 17:20:57

Nochmals danke!

Ach, was ist pascal so schön menschlich! :wink:

Ich denke ich werde es in dieser Form verwenden:

Code: Alles auswählen

find [Start- und End-Verzeichnispfad] -name ".*.mscz," -exec mv "{}" [Zielverzeichnispfad] \;
Es funktioniert und ich denke, das berücksichtigt das "Problem" mit Tante-Tillys-Dateinamen. Wo der von Heisenberg gesehene Unterschied im Ablauf bei den beiden "Schleifen" liegt, ist mir nicht klar geworden.

Grüße, Günther

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Dateien rekursiv verschieben?

Beitrag von heisenberg » 14.12.2018 17:32:00

guennid hat geschrieben:Wo der von Heisenberg gesehene Unterschied im Ablauf bei den beiden "Schleifen" liegt, ist mir nicht klar geworden.
Variante a) mit find -exec mv {} pfad \; führt das aus:

Code: Alles auswählen

mv Dateiname1 Zielverzeichnis; mv Dateiname2 Zielverzeichnis; mv Dateiname3 Zielverzeichnis ; ...
(Ganz viele mv-Aufrufe)

Variante b) mit find -exec mv --target-directory=pfad {} + führt das aus:

Code: Alles auswählen

mv --target-directory=Zielverzeichnis Dateiname1 Dateiname2 Dateiname3 ... 
(Einer oder sehr wenige mv-Aufrufe. Wenn die maximale Anzahl an Dateinamen erreicht ist(max. Befehlslänge 128KiB unter Linux, Siehe: [1]), wird ein weiterer Befehl abgesetzt)

[1] https://www.in-ulm.de/~mascheck/various/argmax/
[2] https://github.com/ninja-build/ninja/issues/1261
Zuletzt geändert von heisenberg am 14.12.2018 17:58:38, insgesamt 4-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

guennid

Re: Dateien rekursiv verschieben?

Beitrag von guennid » 14.12.2018 17:41:20

Wenn die maximale Anzahl an Dateinamen erreicht ist(Befehlslänge), wird ein weiterer Befehl abgesetzt
Ist dafür das letzte Zeichen: + verantwortlich?

Grüße, Günther

Benutzeravatar
heisenberg
Beiträge: 3540
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Dateien rekursiv verschieben?

Beitrag von heisenberg » 14.12.2018 17:43:18

Siehe https://man.cx/find(1)/de

Ansonsten: Ja. Das + - Zeichen steht für: setze hier soviele Dateinamen hin, wie Du in den Befehlsaufruf reinkriegst.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Benutzeravatar
jph
Beiträge: 1049
Registriert: 06.12.2015 15:06:07
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Greven/Westf.

Re: Dateien rekursiv verschieben?

Beitrag von jph » 14.12.2018 22:09:15

heisenberg hat geschrieben: ↑ zum Beitrag ↑
14.12.2018 10:00:12

Code: Alles auswählen

find /pfad -name ".*.mscz" -exec mv --target-directory=/dein/ziel/verzeichnis "{}" +
Weitere Variante, die mit Leerzeichen im Pfadnamen klarkommt:

Code: Alles auswählen

find /pfad -name ".*.mscz" -print0 | xargs -0 mv --target-directory=/dein/ziel/verzeichnis
(Aus der Erinnerung hingeklatscht und nicht mit mv getestet…)

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: Dateien rekursiv verschieben?

Beitrag von Lohengrin » 15.12.2018 00:08:21

guennid hat geschrieben: ↑ zum Beitrag ↑
14.12.2018 14:04:26
2. Backslash als vorletztes Zeichen?
3. Semikolon als letztes Zeichen?
Das ist alles etwas gewöhnungsbedürftig.
Zuerst geht die Shell über den ganzen Befehl und zerlegt ihn in Wörter. Ein ; markiert das Ende des Befehls, ist dasselbe wie ein Zeilenumbruch.
Nun muss der ganze Befehl einen Parameter haben, der ein ; enthält. So will es find mit -exec. Um so einen Parameter zu bauen, muss man das ; maskieren, also \; statt ; schreiben. Dann ersetzt die Shell das \; durch ; und das ; ist Teil des Parameters. In diesem Fall besteht der letzte Parameter aus genau einem Zeichen, nämlich dem ;. (Hoffentlich wird das ;. kein Smiley!)
Harry, hol schon mal das Rasiermesser!

guennid

Re: Dateien rekursiv verschieben?

Beitrag von guennid » 15.12.2018 07:02:56

ad Heisenberg

Danke für die Erklärung. Die manpage hatte ich schon eingesehen.

Ach ja, für "Neulinge": Noch was habe ich erst im Nachhinhein als logisch zwangsläufig entdeckt: Das Zielverzeichnis sollte sich tunlichst außerhalb des Suchpfades befinden. :wink:

OT:
Mein eigentliches Ziel war der verbesserte Umgang mit einem Musiknotenprogramm. Wobei mir das hier wieder mal Anlass gibt, mehr oder weniger ergebnislos zu sinnieren: Welche Mühen eines Umwegs zur Erreichung eines anderen Zieles sind für den sich auf dieses Ziel hin Bewegenden als akzeptabel zu betrachten? Oder wie's Meillo anderwärts formulierte:
Da wird man sich nie komplett einig werden.
(1) :wink:

(1) viewtopic.php?f=15&t=171634&start=15

Grüße, Günther

Benutzeravatar
Revod
Beiträge: 3788
Registriert: 20.06.2011 15:04:29
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) Dateien rekursiv verschieben?

Beitrag von Revod » 15.12.2018 13:26:31

Bin mir unsicher. Willst Du die Sicherungskopien erstellt haben, oder überhaupt nicht?

Hat musescore ( Bin am Arbits Pc ohne musescore ) in den Einstellungen nicht die Option " ... > Sicherungskopie " aktiviert <> deaktiviert?

Grundsätzlich habe ich bei allen meine Anwendungen diese Option deaktiviert und je nach dem klicke ich auf " Speichern unter... " mit eine kleine Dateiname Änderung, z. B. Dateixy.xy > Dateixy1.xy
Systemd und PulseAudio, hmmm, nein danke.

Benutzeravatar
MSfree
Beiträge: 10741
Registriert: 25.09.2007 19:59:30

Re: Dateien rekursiv verschieben?

Beitrag von MSfree » 15.12.2018 13:34:31

guennid hat geschrieben: ↑ zum Beitrag ↑
15.12.2018 07:02:56
Ach ja, für "Neulinge": Noch was habe ich erst im Nachhinhein als logisch zwangsläufig entdeckt: Das Zielverzeichnis sollte sich tunlichst außerhalb des Suchpfades befinden. :wink:
Oder du schließt den Zeilpfad im find-Befehl aus:

Code: Alles auswählen

find . -name .\*.mscz, -not -path ./Zielverzeichnis/\* -exec mv {} Zielverzeichnis \; 

guennid

Re: (gelöst) Dateien rekursiv verschieben?

Beitrag von guennid » 15.12.2018 16:07:51

Revod hat geschrieben:Hat musescore ( Bin am Arbits Pc ohne musescore ) in den Einstellungen nicht die Option " ... > Sicherungskopie " aktiviert <> deaktiviert?
Das hatte ich erwartet, dass so eine Option existiert. Gefunden habe ich sie nicht. Und diese Art der Anlage hätte ich auch abgeschaltet, obwohl ich es gar nicht schlecht finde, wenn Sicherheitskopien generell ohne mein Zutun angelegt werden. Hat mir mitunter schon mal aus der Patsche geholfen. Deswegen hatte ich auch nicht nach Löschen gefragt (wäre wahrscheinlich einfacher gewesen). Nur verstreut übers Dateisystem und dann auch noch "versteckt", möchte ich Sicherheitskopien nicht haben.

Grüße, Günther

Benutzeravatar
Revod
Beiträge: 3788
Registriert: 20.06.2011 15:04:29
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) Dateien rekursiv verschieben?

Beitrag von Revod » 15.12.2018 18:00:02

Konnte nun nach gucken, ja so was wie Sicherungskopie gibt es nicht. Es gibt die Option " Automatisch speichern " , die bei mir deaktiviert. Doch Deine Arbeitsweise ist auch ok, mit den Sicherungskopien. Wie gesagt, ich arbeite gerne mit " Speichern unter... "

Versteckte Sicherungen muss nicht unbedingt sein, da stimme ich Dir zu, oder höchstens im Standard mit ~Datei.xy, dann könnte man es im Dateimanager als Sichtbar einstellen.
Systemd und PulseAudio, hmmm, nein danke.

Antworten