Wie verschiebe ich alle Dateien im aktuellen Ordner in einen Unterordner?


70

Ich bin auf dem Weg:

/myuser/downloads/

Und ich erstelle einen Unterordner:

/myuser/downloads/new

Jetzt möchte ich alle Dateien und Ordner / Unterordner im Download-Ordner in den Unterordner verschieben.

Wie kann ich das machen?

Ich habe es versucht:

mv -R *.* new/

Aber bewegen Sie sich nicht den -R-Schalter, wie es scheint.


4
Sie brauchen -R nicht. Nur mv * newObwohl, wird es jammern „kann sich auf neue nicht neu bewegen“ oder etwas ähnliches. Vielleicht mv -i * newverhindern Sie damit ein Überschreiben.

Antworten:


101

Der Befehl

mv !(new) new

sollte den Trick machen. Wenn es nicht funktioniert, führen Sie shopt -s extglobzuerst.

Um auch versteckte Dateien / Verzeichnisse (die mit einem Punkt beginnen) zu verschieben, führen Sie ebenfalls shopt -s dotglobzuerst aus.
Also, um zusammenzufassen:

shopt -s extglob dotglob
mv !(new) new
shopt -u dotglob

(Es ist immer besser, die Einstellung dotglobzu deaktivieren , um böse Überraschungen zu vermeiden).


5
Kannst du erwähnen, wovon die Bedeutung ist !(something)?
Adeerlike

2
@adeer das heißt eben nicht (irgendwas). Mit anderen Worten, kopieren Sie alles, aber nichts. Klar wie Schlamm?
RockyMountainHigh

4
sehr. Kennst du zufällig das Äquivalent für zsh?
Adeerlike

1
Ich verstehe es nicht, zB was Muss ich devausführen , wenn ich versuche, den Inhalt des Ordners an meinen aktuellen Speicherort zu verschieben mv !(dev) dev? Ich bekomme-bash: !: event not found
Black

5
@adeer sehr ähnlich. setopt extendedglobum den erweiterten Glob-Modus in zsh zu setzen. ^ist das Ausschlusssymbol, mv ^new newwürde also den Trick machen. dann, um alle in zsh festgelegten Optionen anzuzeigen setoptund den erweiterten Glob-Modus zu deaktivieren, können Sie dies tununsetopt extendedglob
Mr. T

10

Ich habe so etwas gefunden, aber es ist ein bisschen einfacher zu verstehen, und es könnte auch für Sie gut funktionieren:

ls | grep -v new | xargs mv -t new

Hinzufügen einer Erklärung zu der obigen Lösung:

Aus Manpages:

  • mv -t

    -t, --target-directory=DIRECTORY
          move all SOURCE arguments into DIRECTORY
    
  • grep -v

    -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
    

Schritt für Schritt erklärt:

  • ls listet die Dateien im aktuellen Verzeichnis auf
  • grep -v new wird zurückgeleitet, dass nicht neu übereinstimmen
  • xargs mv -t newVerschiebt die darauf umgeleiteten Dateien grep -vin das Zielverzeichnis

Ich habe versucht , diese Methode aber ich bin immer: mv: illegal option -- t. Liegt das daran, dass ich benutze zsh?
ConstantFun

@ConstantFun Es könnte zsh sein, aber ich vermute, es ist Ihre Implementierung von mv(was bedeutet, dass Ihre Version von mv anders ist als die, die ich verwendet habe), welches Betriebssystem verwenden Sie? Ich glaube, als ich diese Antwort schrieb, war ich auf Linux Distribution centosmit bash.
Lockwobr

2
Wenn ich dies nur auf osx teste, erhalte ich den gleichen Fehler mv: illegal option -- t, weil das mv von osx keine -tOption hat.
Lockwobr

1
(Ich habe dies nicht ausprobiert und plane es nicht.) Dieser Link erklärt Ihnen, wie Sie den Gnucore installieren, der Ihnen helfen soll, Gnu-Kern-Cli-Utils zu erhalten. Osx wird mit BSD ausgeliefert CLI-Tools, die sich von denjenigen unterscheiden, die mit Linux geliefert werden.
Lockwobr

Ich bin auf OSX ausgeführt zsh, so ist es wahrscheinlich das Betriebssystem dann ..? Danke fürs klarstellen!
ConstantFun

7

Einfache Idee. Angenommen, Sie befinden sich in / myuser , benennen Sie die Downloads in new um , erstellen Sie ein neues Download- Verzeichnis und verschieben Sie es in new .

mv downloads new # downloads is now called new
mkdir downloads # create new directory downloads
mv new downloads # move new into it.

1

Wenn Sie alle Dateien aus einem Ordner in einen seiner Unterordner verschieben möchten, können Sie den folgenden Befehl verwenden:

find /myuser/downloads/ -type d -name 'new' -prune -type f | xargs mv -t /myuser/downloads/new

Es findet alle Dateien und verschiebt sie in Ihren Unterordner.

@waltinator: hinzugefügt -type d -name 'new' -prune, um das Durchqueren von zu verhindern /myuser/downloads/new.


Ich habe ein Unterverzeichnis mit dem Namen erstellt newund diesen Befehl ausprobiert. Ich erhalte mv: missing file operandundTry 'mv --help' for more information
mook765 13.10.16

1

Sie können diesen alternativen Prozess ausprobieren - im Pfad bleiben

/myuser/downloads/

aber, anstatt zuerst das Erstellen von /myuser/downloads/new/Verzeichnis, anstatt einen Ordner im erstellen /myuser/Verzeichnis, mit dem Befehl mkdir ../new, dann verschieben Sie alle Dateien in downloadszu new, und schließlich bewegt newin downloads. Sie können dies in einer Zeile im /myuser/downloads/Pfad mit dem folgenden Befehl tun :

mkdir ../new && mv * ../new && mv ../new ../downloads

In diesem Fall müssen Sie nicht über jede Art von „Filtern“ von Dateien / Ordnern kümmern, da newauf der gleichen Ebene des Pfades ist wie downloads, so können Sie einfach alles in Bewegung downloadszu new, und dann bewegen newin downloads`.

Wenn Sie den Unterordner jedoch bereits newerstellt haben und keinen weiteren Ordner erstellen möchten, müssen Sie sich keine Sorgen machen. Ändern Sie den mkdirBefehl links neben dem ersten &&im obigen mvBefehl in einen Befehl, und drücken Sie newdie Taste Pfad; in anderen Worten, während Sie noch in sind /myuser/downloads/, können Sie ändern mkdir ../newzu mv new ... Dann wird der Unterordner new[im Pfad /myuser/downloads/new/] /myuser/new/auf dieselbe Ebene verschoben wie /myuser/downloads/und Sie können den Rest des Befehls wie oben gezeigt ausführen. Alles in allem haben wir, ausgehend vom Pfad /myuser/downloads/:

mv new .. && mv * ../new && mv ../new ../downloads

und da Sie alle Dateien und Ordner / Unterordner im Download-Ordner in den Unterordner [ new] verschieben wollten , sind Sie fertig! Wenn Sie nur Dateien (oder nur Ordner oder [Objektverschiebung detaillierter einfügen]) verschieben möchten, müssen Sie andere Befehle verwenden, mit denen Objekte "gefiltert" werden können, z grep. Die oben beschriebenen Befehle sind jedoch für Ihre Zwecke ausreichend.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.