Allgemein > Allgemeines
mehrere hundert Files verschieben
escimo:
Ja hast recht. Das Suchmuster "*.*" sucht nur die Dateien, die eine Punkt im Dateinamen enthalten. "Altsheimer lässt grüßen." ::)
Ten Little Indyans:
--- Zitat von: Padde am 15. November 2007, 17:09:33 ---
--- Code: ---find . -type f -mtime +13 -exec mv {} /<zielverzeichnis> \;
--- Ende Code ---
Bei sehr vielen Dateien kann es aber Probleme geben, da die maximale Länge einer Kommandozeile beschränkt ist. Dann hilft xargs(1) weiter.
--- Ende Zitat ---
???
Wo spielt da die Länge der Kommandozeile eine Rolle? Der Befehl mv wird für jeden Treffer einmal aufgerufen, wobei dessen Name anstelle von {} erscheint.
Wenn also 10000 Dateien gefunden werden dann wird 10000 mal mv aufgerufen, jeweils als "mv <dateiname> /<zielverzeichnis>".
Sämtliche xargs-Beispiele die ich kenne benutzen find mit -print. Ich habe bis heute nicht verstanden was daran besser sein soll als -exec {}.
meik:
--- Zitat von: Ten Little Indyans am 15. November 2007, 21:47:25 ---Sämtliche xargs-Beispiele die ich kenne benutzen find mit -print. Ich habe bis heute nicht verstanden was daran besser sein soll als -exec {}.
--- Ende Zitat ---
Der Vorteil ist halt, dass du nicht mv für jede Datei einzeln aufrufst, sondern im Idealfall für alle Dateien zusammen nur einmal. Limit ist da nur die maximal mögliche Länge der Befehlszeile. Damit spart man halt das exzessive Starten von neuen Prozessen.
Der Nachteil von -print und xargs ist dass Handling von Leer- und anderen Sonderzeichen. Dafür gibt es ja bei den GNU-Pendands -print0 und "xargs -0", um ein \0 als Trennzeichen zu nehmen.
Ten Little Indyans:
--- Zitat von: meik am 16. November 2007, 10:54:44 ---
--- Zitat von: Ten Little Indyans am 15. November 2007, 21:47:25 ---Sämtliche xargs-Beispiele die ich kenne benutzen find mit -print. Ich habe bis heute nicht verstanden was daran besser sein soll als -exec {}.
--- Ende Zitat ---
Der Vorteil ist halt, dass du nicht mv für jede Datei einzeln aufrufst, sondern im Idealfall für alle Dateien zusammen nur einmal. Limit ist da nur die maximal mögliche Länge der Befehlszeile. Damit spart man halt das exzessive Starten von neuen Prozessen.
--- Ende Zitat ---
Solche Fragen sind immer ein willkommener Anlass das eigene Wissen aufzufrischen... ;D
xargs weiss also wie lang die Befehlszeile auf einem System sein darf. Man übergibt das auszuführende Kommando sowie möglicherweise ein paar "initial arguments" und dann füllt xargs die Befehlszeile bis zum Anschlag mit Werten vom Standard Input, und zwar so oft bis alles abgearbeitet ist.
Damit ist xargs aber für diesen konkreten Einsatzfall (mv) trotzdem nicht zu gebrauchen, da zusätzliche Parameter nur vor den Dateinamen kommen können.
Man könnte jetzt natürlich ein Einzeiler-Zwischenskript aufsetzen mit "mv $* /<zielverzeichnis>" und dieses von xargs aufrufen lassen. Dabei hat man aber das Problem dass man nicht genau weiss wieviel Platz einem in der Befehlszeile noch bleibt. Wenn xargs sie wirklich voll macht und für das Zielverzeichnis kein Platz bleibt dann knallt es trotzdem...
meik:
--- Zitat von: Ten Little Indyans am 16. November 2007, 12:12:45 ---Solche Fragen sind immer ein willkommener Anlass das eigene Wissen aufzufrischen... ;D
--- Ende Zitat ---
Stimmt! :-)
--- Zitat ---xargs weiss also wie lang die Befehlszeile auf einem System sein darf. Man übergibt das auszuführende Kommando sowie möglicherweise ein paar "initial arguments" und dann füllt xargs die Befehlszeile bis zum Anschlag mit Werten vom Standard Input, und zwar so oft bis alles abgearbeitet ist.
--- Ende Zitat ---
Genau. Das hängt ganz vom System ab, ob es da eine globale Einschränkung gibt, oder ob xargs sich selber da auf einen sinnvollen Wert (64k anymore?) beschränkt. Wie das konkret aussieht, kann ich dir auch nicht sagen.
--- Zitat ---Damit ist xargs aber für diesen konkreten Einsatzfall (mv) trotzdem nicht zu gebrauchen, da zusätzliche Parameter nur vor den Dateinamen kommen können.
--- Ende Zitat ---
Ja, das stimmt. Grundsätzlich kann xargs auch mit Platzhaltern wie das {} bei "find -exec" arbeiten, allerdings sehe ich auch gerade in der Doku, dass dann immer nur ein Parameter auf einmal abgearbeitet wird.
--- Zitat ---Man könnte jetzt natürlich ein Einzeiler-Zwischenskript aufsetzen mit "mv $* /<zielverzeichnis>" und dieses von xargs aufrufen lassen. Dabei hat man aber das Problem dass man nicht genau weiss wieviel Platz einem in der Befehlszeile noch bleibt. Wenn xargs sie wirklich voll macht und für das Zielverzeichnis kein Platz bleibt dann knallt es trotzdem...
--- Ende Zitat ---
Ja, da könnte man noch einiges an Gehirnschmalz reinstecken (du kannst z.B. xargs die maximale Länge mitgeben und so Platz schaffen oder in dem Script nochmal xargs aufrufen), aber das macht wohl nur Sinn, wenn man wirklich Performance-Probleme hat. Für einmalige Aktionen lohnt das den Aufwand nicht, außer man verbucht das unter "Weiterbildung". ;-)
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln