Paul: Linux Konsole, Dateien verschieben

Hallo Forum,

könnt Ihr mir bei einer Linux-Frage helfen?
Wie kann ich über einen Konsolenbefehl alle Dateien eines Verzeichnisses in ein Unterverzeichnis dieses Verzeichnisses verschieben?

z.B. von /home/username/
    nach /home/username/bilder/

Danke für Nachhilfe

LG
Paul

  1. Hi Paul,

    du suchst mv.

    MfG
    Otto

    1. Hi Otto,

      du suchst mv.

      vielen Dank für die Antwort. Aber mv habe ich nicht gesucht, das kenne ich schon. Meine Frage ist spezieller und ich komme nicht damit klar.

      wie kann ich alle DATEIEN
      von               /home/username/*
      nach              /home/username/bilder/*

      verschieben?

      Das Verzeichnis /home/username/ soll selber nicht verschoben werden, was auch nicht möglich wäre, da es dann in sich selbst verschoben werden müsste...

      DAS ist das Problem.

      Geht es ohne ein Shellskript?

      LG
      Paul

      1. Hallo,

        DAS ist das Problem.

        welches Problem?

        mv *.* ./bilder/

        (davon ausgehend, dass Du Dich im Quellverzeichnis befindest)

        Grüße Basti

        1. Hi basti_p,

          Wenn ich das jetzt richtig verstanden habe möchte er nur reguläre Dateien verschieben, jedoch keine Verzeichnisse.

          MfG
          Otto

          1. Hallo,

            Wenn ich das jetzt richtig verstanden habe möchte er nur reguläre Dateien verschieben, jedoch keine Verzeichnisse.

            ich dachte, durch *.* (beachte den Punkt) werden nur Dateien verarbeitet?

            Grüße Basti

            1. Hallo,

              Wenn ich das jetzt richtig verstanden habe möchte er nur reguläre Dateien verschieben, jedoch keine Verzeichnisse.
              ich dachte, durch *.* (beachte den Punkt) werden nur Dateien verarbeitet?

              nein, alle Dateien *und* Verzeichnisse, die einen Punkt im Namen haben. Abgesehen davon genügt im Gegensatz zu DOS/Windows ein * als Platzhalter für "alles", die aufgeblähte Form *.*, die Einträge ohne einen Punkt übergehen würde, ist nicht nötig.

              Außerdem habe ich mit keinem Wort erwähnt gesehen, dass Paul keine Unterverzeichnisse verschieben will, ausgenommen das Verzeichnis, das als Ziel dienen soll (da wäre es ja weder logisch noch möglich).

              Ciao,
               Martin

              --
              If you believe in telekinesis, raise my hand.
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hi Der Martin,

                Außerdem habe ich mit keinem Wort erwähnt gesehen, dass Paul keine Unterverzeichnisse verschieben will, ausgenommen das Verzeichnis, das als Ziel dienen soll (da wäre es ja weder logisch noch möglich).

                Hier schreibt er "Wie kann ich alle DATEIEN"

                Das habe ich als alle regulären Dateien interpretiert und somit Verzeichnisse ausgeschlossen. Ansonsten kann man das auch mit mv machen, es gibt dann eben für das Ziel Verzeichnis eine Fehlermeldung aus.

                Es wäre sicherlich hilfreich wenn Paul mein ein Beispiel bringt mit IST- und SOLL-Situation.

                MfG
                Otto

                1. Hi der Otto,

                  Außerdem habe ich mit keinem Wort erwähnt gesehen, dass Paul keine Unterverzeichnisse verschieben will, ausgenommen das Verzeichnis, das als Ziel dienen soll (da wäre es ja weder logisch noch möglich).

                  Hier schreibt er "Wie kann ich alle DATEIEN"

                  Das habe ich als alle regulären Dateien interpretiert und somit Verzeichnisse ausgeschlossen. Ansonsten kann man das auch mit mv machen, es gibt dann eben für das Ziel Verzeichnis eine Fehlermeldung aus.

                  Es wäre sicherlich hilfreich wenn Paul mein ein Beispiel bringt mit IST- und SOLL-Situation.

                  Im Prinzip wäre es schon gut, auch Unterverzeichnisse mit verschieben zu können. Die Begehrlichkeit ist aber just eben beim Lesen von Martins Beitrag entstanden.

                  Uraufgabe ist tatsächlich nur, die regülären Dateien (also auch keine Links) in das Unterverzeichnis zu verschieben, OHNE eine Fehlermeldung zu kassieren für das rekursive Verzeichnis.

                  LG
                  Paul

                  1. Hallo,

                    Hier schreibt er "Wie kann ich alle DATEIEN"

                    ja, und für mich ist das ein Oberbegriff, der "gewöhnliche" Dateien, aber auch Verzeichnisse einschließt - frei nach dem Unix-Motto: Everything is a file.

                    Im Prinzip wäre es schon gut, auch Unterverzeichnisse mit verschieben zu können. Die Begehrlichkeit ist aber just eben beim Lesen von Martins Beitrag entstanden.

                    Oh, ich wollte keine schlummernden Wünsche wecken ... ;-)

                    Uraufgabe ist tatsächlich nur, die regülären Dateien (also auch keine Links) in das Unterverzeichnis zu verschieben, OHNE eine Fehlermeldung zu kassieren für das rekursive Verzeichnis.

                    Die Fehlermeldung wäre ja nicht das Problem - wenn man weiß, dass sie kommen wird, muss man sich ja nicht daran stören. Lästig ist vielmehr, dass mv bei einem solchen Fehler komplett abbricht. Hier fehlt IMO ein Switch wie "skip on error".

                    Da bleibt vermutlich echt nur eine raffiniert angestellte Befehlsverkettung mit find als wichtigem Bestandteil ...

                    So long,
                     Martin

                    --
                    Das Leben ist lebensgefährlich und endet meistens tödlich.
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                    1. Hi Der Martin,

                      Da bleibt vermutlich echt nur eine raffiniert angestellte Befehlsverkettung mit find als wichtigem Bestandteil ...

                      Warum? Das exclude bei find geht zwar nicht so schön wie bei tar, jedoch ist es möglich. Hier wird das ganz gut erklärt.

                      Von Interesse sind die find Optionen
                      -wholename
                      -prune
                      -o
                      -print bzw. in Kombination mit xargs -print0

                      MfG
                      Otto

                      1. Also, wenn man alles, wirklich alles außer dem Zielverzeichnis selbst, in das Zielverzeichnis schieben will, dann empfiehlt sich die zsh-Methode erst Recht:

                        mv *~ziel ziel

                        (mit extendedglob)...

                        Oder eben nach der Option suchen, die mv bei diesem Fehler abbrechen lässt...

                  2. Moin!

                    Uraufgabe ist tatsächlich nur, die regülären Dateien (also auch keine Links) in das Unterverzeichnis zu verschieben, OHNE eine Fehlermeldung zu kassieren für das rekursive Verzeichnis.

                    Was ist das Problem mit der Fehlermeldung? Das kein Fehler auftreten darf? (wuesste grad nicht, wo das stoert) oder dass einfach nur nichts angezeigt wird? Letzteres kann man loesen indem man mit 2> Die Fehlermeldungen umleitet. Wurde ja bereits geschrieben. Geht sogar in der Konsole (Command Prompt) von Windows.

                    --
                    Signaturen sind blöd!
              2. Hallo Martin,

                Wenn ich das jetzt richtig verstanden habe möchte er nur reguläre Dateien verschieben, jedoch keine Verzeichnisse.
                ich dachte, durch *.* (beachte den Punkt) werden nur Dateien verarbeitet?

                nein, alle Dateien *und* Verzeichnisse, die einen Punkt im Namen haben. Abgesehen davon genügt im Gegensatz zu DOS/Windows ein * als Platzhalter für "alles", die aufgeblähte Form *.*, die Einträge ohne einen Punkt übergehen würde, ist nicht nötig.

                Außerdem habe ich mit keinem Wort erwähnt gesehen, dass Paul keine Unterverzeichnisse verschieben will, ausgenommen das Verzeichnis, das als Ziel dienen soll (da wäre es ja weder logisch noch möglich).

                genau das ist das Problem.

                Wenn es nur ein Unterverzeichnis ist, kann man das zur Not noch zu Fuß machen. Wenn es aber mehrere sind, wir es schon lästig.

                Aber das Zielverzeichnis selber darf man nicht in sich selbst kopieren. Das gibt auf die Finger...

                LG
                Paul

                1. Aber das Zielverzeichnis selber darf man nicht in sich selbst kopieren. Das gibt auf die Finger...

                  Ja, es gibt aber nur eine Meldung, die man getrost ignorieren kann. Aller anderen Dateien/Verzeichnisse werden ja trotzdem verschoben.

                  Als zsh-User habe ich auch die Möglichkeit, einzelne Dateitypen zu adressieren, z. B. reguläre Dateien mit \*(.)', Verzeichnisse mit *(/)', links mit `*(@)'...

                  Mit der zsh hat man aber auch die Möglichkeit, gewisse globs aus dem globbing auszuschließen.

                  Ist die Struktur wie folgt:

                  $PWD
                   |---- bild01.png
                   |---- bild02.gif
                   |---- bild03.jpg
                   |---- einv
                   |      |---- bild04.png
                   |      |-----bild05.iff
                   |---- nochein.gif
                   |---- ziel
                   |      |---- bild06.gif
                   |---- zuletzt.png

                  addressiert man mit

                  **/*~(**ziel)~ziel/*

                  genau die Dateien bild01.png, bild02.gif, bild03.jpg, einv/bild04.png und einv/bild05.iff

                  Setzt man das ein in

                  mv **/*~(**ziel)~ziel/* ziel

                  hat man allerdings das problem, dass bild04.png und bild05.iff nicht mehr existieren, wenn einv mal verschoben ist, also nur reguläre Dateien:

                  mv **/*~(**ziel)~ziel/*(.) ziel

                  $PWD
                   |---- einv
                   |---- ziel
                          |---- bild01.png
                          |---- bild02.gif
                          |---- bild03.jpg
                          |---- bild04.png
                          |-----bild05.iff
                          |---- bild06.gif
                          |---- nochein.gif
                          |---- zuletzt.png

                  Vorsicht mit doppelten Dateinamen!!!

                  Achja, und man muss mittels

                  setopt extendedglob

                  dieses fancy feature erstmal einschalten...

                  Gruß,
                  Jagged

                  1. Hallo,

                    Aber das Zielverzeichnis selber darf man nicht in sich selbst kopieren. Das gibt auf die Finger...
                    Ja, es gibt aber nur eine Meldung, die man getrost ignorieren kann. Aller anderen Dateien/Verzeichnisse werden ja trotzdem verschoben.

                    nein, ich hab's eben ausprobiert: mv bricht beim ersten auftretenden Fehler komplett ab (getestet auf Ubuntu 10.10 "maverick").

                    Ciao,
                     Martin

                    --
                    F: Was ist eigentlich aus deinem schlimmen Durchfall geworden?
                    A: Mein Arzt hat mir Valium verschrieben.
                    F: Und das hilft?
                    A: Naja, ich mach mir immer noch in die Hose. Aber inzwischen ist es mir egal.
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                    1. nein, ich hab's eben ausprobiert: mv bricht beim ersten auftretenden Fehler komplett ab (getestet auf Ubuntu 10.10 "maverick").

                      Hmmm... also, ich nutze schon seit fast 20Jahren unixoide Systeme, derlei Verhalten ist mir noch nicht untergekommen, aber es wahrscheinlich eine Option, die irngwo in /etc/profile oder /etc/bashrc eingebaut ist.

                      Ich kenne mich mit der bash (die du wahrscheinlich benutzt (echo $SHELL)) nicht aus, also...

                      Auch die zsh (die ich übrigens empfehlen möchte :-) hat ähnliche Eigenschaften...

                      kleiner Nachtrag zu oben:

                      das ~(\*\*ziel)' schließt das Zielverzeichnis aus dem Traversal aus, das ~ziel' aus der Ergebnisliste, mit angehängtem `(.)' für nur reguläre Dateien ist das zweite freilich überflüssig...

                      1. Hi,

                        nein, ich hab's eben ausprobiert: mv bricht beim ersten auftretenden Fehler komplett ab (getestet auf Ubuntu 10.10 "maverick").
                        Hmmm... also, ich nutze schon seit fast 20Jahren unixoide Systeme, derlei Verhalten ist mir noch nicht untergekommen

                        dann kann ich dich beruhigen, deine Welt scheint doch noch in Ordnung zu sein. Ich habe mich aufgrund fehlender Symptome täuschen lassen: Ich habe von mv nur die Fehlermeldung an der Konsole gesehen, nicht aber die Liste der erfolgreich verschobenen Dateien, die ich eigentlich erwartet hatte (da bin ich vielleicht von der DOS/Windows-Kommandozeile verwöhnt).

                        Aber hinterher nochmal nachgesehen: Die restlichen Dateien, bei denen es möglich war, sind tatsächlich alle verschoben worden.

                        Damit ist also tatsächlich mv allein ohne jegliche Tricks und Kapriolen für die Aufgabe geeignet, die Paul geschildert hat. Einfach die Fehlermeldung ignorieren, man erwartet sie ja, und gut is'.

                        Ciao,
                         Martin

                        --
                        Niemand lebt allein von seinen Träumen.
                        Aber wer träumt, lebt noch.
                        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                        1. Damit ist also tatsächlich mv allein ohne jegliche Tricks und Kapriolen für die Aufgabe geeignet, die Paul geschildert hat. Einfach die Fehlermeldung ignorieren, man erwartet sie ja, und gut is'.

                          oder `2>/dev/null' anhängen... dann schreit niemand mehr :-)

                          Ich hatte mich aber gewundert und die coreutils-info nochmal ausgegraben und nach komischen Parametern gesucht, die ich noch nicht kannte... zwar habe ich nichts gefunden, aber das heißt ja nicht, dass die Ubuntu'ler nicht irgendwas an der Shell gestrickt hätten/haben könnten...

                          Gute Nacht!

                        2. nicht aber die Liste der erfolgreich verschobenen Dateien, die ich eigentlich erwartet hatte

                          Hätte ein einfaches -v aktiviert. Über nen Alias kannst du es auch dauerhaft einschalten, wenn du es haben willst:

                          alias mv='mv -v'

                          Das Ganze in die .bashrc und du hast es in jedem neu geöffneten Terminal.

                          (da bin ich vielleicht von der DOS/Windows-Kommandozeile verwöhnt).

                          Wieso? Weil es was tut, was ich nicht explizit anfordere? Genaus das ist es, was mich an WIndows so nervt, dass es versucht, für mich zu denken, aber schon an den einfachsten Dingen scheitert.

                          1. Hallo,

                            nicht aber die Liste der erfolgreich verschobenen Dateien, die ich eigentlich erwartet hatte
                            Hätte ein einfaches -v aktiviert. Über nen Alias kannst du es auch dauerhaft einschalten, wenn du es haben willst:
                            alias mv='mv -v'
                            Das Ganze in die .bashrc und du hast es in jedem neu geöffneten Terminal.

                            danke, das ist eine gute Idee.

                            (da bin ich vielleicht von der DOS/Windows-Kommandozeile verwöhnt).
                            Wieso? Weil es was tut, was ich nicht explizit anfordere? Genaus das ist es, was mich an WIndows so nervt, dass es versucht, für mich zu denken, aber schon an den einfachsten Dingen scheitert.

                            Grundsätzlich haue ich genau in dieselbe Kerbe - ich schätze es aber, wenn Programme bei der Arbeit geschwätzig sind und genau erzählen, was sie gerade tun (dann kann man das auch in eine Logdatei umlenken). Umgekehrt mag ich es nicht, wenn Programme so verschwiegen sind, dass ich gelegentlich nicht mehr erkennen kann, ob da wirklich noch das abläuft, was ich will, oder etwas ganz anderes, oder gar nichts mehr.
                            Das ist IMHO etwas anderes, als wenn ein Programm meint, für mich denken zu müssen und Dinge tut, die ich nicht bestellt habe.

                            So long,
                             Martin

                            --
                            Zwei Stammtischbrüder:
                            Hier steht, dass laut Statistik über 60 Prozent aller Ehefrauen fremdgehen.
                            Was soll ich mit dieser Information? Ich brauche Namen, Fotos, Telefonnummern ... !
                            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                            1. Das ist IMHO etwas anderes, als wenn ein Programm meint, für mich denken zu müssen und Dinge tut, die ich nicht bestellt habe.

                              Für mich ist es eben genau das, es versucht, mir die Entscheidung abzunehmen, was ich sehen will.

                              Ich sehe erstmal möglichst  wenig, was mir bei Scripts massiv hilft, weil ich

                              a. keine unnötigen Ausgaben habe und Fehler trotzdem angezeigt bekomme, weil ich die Rückgaben überwache
                              b. das Script schneller läuft, weil nicht jede unnötige Zeile durch den Framebuffer ins (eh schon relativ langsame) Terminal geschubst werden muss.

                              Will ich mehr sehen, kann ich das per alias machen, soweit ich weiss, kann Windows das nicht. Allerdings benutze ich Windows grad mal für ein paar Spiele und CAD. Wenn ich was in der Kommandozeile haben will, hab ich coLinux drauf. Damit macht Windows wenigstens mal was sinnvolles, es lässt Linux als Dienst laufen *g*

                              Aber alles, ist, wie immer, Geschmacksache. Du willst gesprächige Programme, ich will Programme, die die Klappe halten, solange ich nichts anderes sage. (Ja, wenns solche Frauen gäbe *g*)
                              Und wenn ein Programm ein Problem hatte, kann ich es nach dem Beenden einfach per echo $? ausgeben lassen.

              3. Tach,

                Abgesehen davon genügt im Gegensatz zu DOS/Windows ein * als Platzhalter für "alles", die aufgeblähte Form *.*, die Einträge ohne einen Punkt übergehen würde, ist nicht nötig.

                nicht ganz: die * Wildcard übergeht in bash standardmäßig Dateien, deren Name mit einem Punkt anfängt, es gibt keinen Platzhalter für alle Dateien, konfigurierbar ist das über die Option dotglob ändern: http://www.faqs.org/docs/bashman/bashref_34.html

                mfg
                Woodfighter

                1. nicht ganz: die * Wildcard übergeht in bash standardmäßig Dateien, deren Name mit einem Punkt anfängt, es gibt keinen Platzhalter für alle Dateien,

                  Lässt sich aber leicht umgehen:

                  mv * .* Ziel

                  Damit werden wirklich alle Dateien und Verzeichnisse verschoben. Und wer will macht es so:

                  alias ma='mv * .*'

                  Dann kann man mit ma Ziel alles aus dem aktuellen Verzeichnis nach "Ziel" verschieben.

                  Ob ein

                  alias *='* .*'

                  funktioniert,  hab ich nicht probiert, aber ich gehe stark davon aus, das wird fehlschlagen ;)

      2. Hi Paul,

        Verstehe ich dich richtig? Du hast folgende Ausgangssituation:

        └── username
            ├── a
            │   ├── eis.jpg.1
            │   └── Italian_ice_cream.jpg
            ├── Eis_2.jpg
            └── z
                └── eis.jpg

        Nun soll "Eis_2.jpg" z.B. nach "a" verschoben werden?

        Dann würde ich das mit find machen, interessant sind die Optionen maxdepth, type und print0. Die Ausgabe packst du dann mit einer Pipe in xargs und verschiebst die Dateien mit mv.

        MfG
        Otto

  2. Wie kann ich über einen Konsolenbefehl alle Dateien eines Verzeichnisses in ein Unterverzeichnis dieses Verzeichnisses verschieben?

    z.B. von /home/username/
        nach /home/username/bilder/

    Das einfachste ist doch die Verwendung der bash nebst ihrer "File Test Operators". Für Deinen Fall sieht die Befehlszeile so aus (vom Verzeichnis /home/username aus ausführen):

    for i in *; do [ -f $i ] && mv $i bilder/; done

    Viele Grüße

    Andreas