Superuser

Autor Thema: mehrere hundert Files verschieben  (Gelesen 7507 mal)

hotrod

  • Gast
mehrere hundert Files verschieben
« am: 15. November 2007, 11:23:43 »
Hallo,

ich muss einige hundert Files aus einem Ordner verschieben welche alle unterschiedliche namen tragen. Ich möchte diese nach dem Datum zusammengefasst verschieben (also z.B. alle files vom 31.Oktober 2007). Kann mir jemand helfen wie ich dies hinkriege?

Gruss Stephan

sonnenblen.de - Das unabhängige Sun User Forum

mehrere hundert Files verschieben
« am: 15. November 2007, 11:23:43 »

hotrod

  • Gast
Re: mehrere hundert Files verschieben
« Antwort #1 am: 15. November 2007, 11:42:32 »
so, einen kleinen schritt bin ich schon weiter:

find . '*.*' -type f -mtime +14 -exec ls -ltr {} \;

listet alle files in dem Ordner auf die älter als 14Tg. sind... jetz muss ich die nur noch irgendwie mv können..

hotrod

  • Gast
Re: mehrere hundert Files verschieben
« Antwort #2 am: 15. November 2007, 12:08:51 »
ok, habs rausgefunden  ;D

find . '*.*' -type f -mtime +13 -exec mv  {} /<zielverzeichnis>  \;

Offline escimo

  • Sobl Guru
  • *****
  • Beiträge: 1674
  • SPARCstation 2
    • Youtube-Kanal opensparcbox.org
Re: mehrere hundert Files verschieben
« Antwort #3 am: 15. November 2007, 15:45:58 »
Da sollte auch ein einfaches find ohne '*.*' reichen.

find . -name "*" ...
bringt dir keine versteckten Dateien.

find . -name "*.*" -type ...
bringt dir alle Dateien in allen Verzeichnissen vom aktuellen Arbeitsverzeichnis ("find ." aus)

Offline Padde

  • Sobl Bachelor
  • ***
  • Beiträge: 135
  • Hier könnte Ihre Werbung stehen!
Re: mehrere hundert Files verschieben
« Antwort #4 am: 15. November 2007, 17:09:33 »
find . -name "*.*" -type ...
bringt dir alle Dateien in allen Verzeichnissen vom aktuellen Arbeitsverzeichnis ("find ." aus)

Bei dieser Variante werden nur Dateien erfasst, die mindestens einen Punkt im Dateinamen enthalten. Will man ausnahmslos alle Dateien erfassen, läßt man einfach -name ... weg. Korrekt wäre:

find . -type f -mtime +13 -exec mv {} /<zielverzeichnis>  \;
Bei sehr vielen Dateien kann es aber Probleme geben, da die maximale Länge einer Kommandozeile beschränkt ist. Dann hilft xargs(1) weiter.

Offline escimo

  • Sobl Guru
  • *****
  • Beiträge: 1674
  • SPARCstation 2
    • Youtube-Kanal opensparcbox.org
Re: mehrere hundert Files verschieben
« Antwort #5 am: 15. November 2007, 17:35:43 »
Ja hast recht. Das Suchmuster "*.*" sucht nur die Dateien, die eine Punkt im Dateinamen enthalten. "Altsheimer lässt grüßen."  ::)

Offline Ten Little Indyans

  • Sobl Bachelor
  • ***
  • Beiträge: 218
Re: mehrere hundert Files verschieben
« Antwort #6 am: 15. November 2007, 21:47:25 »

find . -type f -mtime +13 -exec mv {} /<zielverzeichnis>  \;
Bei sehr vielen Dateien kann es aber Probleme geben, da die maximale Länge einer Kommandozeile beschränkt ist. Dann hilft xargs(1) weiter.

 ???

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 {}.

Offline meik

  • Sobl Bachelor
  • ***
  • Beiträge: 187
Re: mehrere hundert Files verschieben
« Antwort #7 am: 16. November 2007, 10:54:44 »
Sämtliche xargs-Beispiele die ich kenne benutzen find mit -print. Ich habe bis heute nicht verstanden was daran besser sein soll als -exec {}.

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.

Offline Ten Little Indyans

  • Sobl Bachelor
  • ***
  • Beiträge: 218
Re: mehrere hundert Files verschieben
« Antwort #8 am: 16. November 2007, 12:12:45 »
Sämtliche xargs-Beispiele die ich kenne benutzen find mit -print. Ich habe bis heute nicht verstanden was daran besser sein soll als -exec {}.

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.

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...


Offline meik

  • Sobl Bachelor
  • ***
  • Beiträge: 187
Re: mehrere hundert Files verschieben
« Antwort #9 am: 16. November 2007, 13:20:31 »
Solche Fragen sind immer ein willkommener Anlass das eigene Wissen aufzufrischen... ;D

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.

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.

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...

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". ;-)

sonnenblen.de - Das unabhängige Sun User Forum

Re: mehrere hundert Files verschieben
« Antwort #9 am: 16. November 2007, 13:20:31 »