Ordnerinhalt um eine Ebene nach oben verschieben


127

Ich habe ein Verzeichnis, das entpackt ist, sich aber in einem Ordner befindet. Wie kann ich den Inhalt um eine Ebene nach oben verschieben? Ich greife über SSH auf CentOS zu.

Antworten:


189

Mit dem Ordner 'myfolder' und einer Ebene höher in der Dateihierarchie (der Punkt, den Sie einfügen möchten) würde der Befehl lauten:

mv myfolder/* .

Wenn also zum Beispiel die Daten /home/myuser/myfolderaus waren, /home/myuser/führen Sie den Befehl aus.


35
Möglicherweise müssen Sie auch .*nicht nur übereinstimmen , *wenn das Archiv Punktedateien enthielt. Fügen Sie außerdem "&& rmdir myfolder" am Ende hinzu, um den jetzt nicht mehr benötigten Ordner zu entfernen. Dies ist sicher, weil es nur ausgeführt wird, wenn der Befehl mv Erfolg zurückgibt UND weil rmdir kein nicht leeres Verzeichnis entfernt.
Caleb

Guter Punkt auf der .*. Das Entfernen des Originalordners ist trivial und wird nicht verlangt, daher überlassen wir es OP, sich selbst darum zu kümmern.
Rudu

1
@Caleb ist es möglich, sowohl *als auch .*in einer Zeile zu schreiben ? Nur Neugier
Richard

2
@ Richard Ja, das ist es. Die Argumente für mvsind alle Quellen mit Ausnahme des LETZTEN Arguments, das das Ziel für das Verschieben sein muss (und im Fall mehrerer Quellen muss es sich um einen Ordner handeln).
Caleb,

1
Ich /bin/mv: Argument list too long
bekomme

26

Nur um es kristallklar zu machen, entnommen aus Rudus Antwort oben und den Kommentaren.

Wenn Sie den gesamten Inhalt verschieben müssen, EINSCHLIESSLICH der Dateien, die mit einem beginnen. (wie .htaccess, .git usw.) müssen Sie sowohl * als auch. * in Ihren Befehl aufnehmen. Wie so:

 mv subfolder/* subfolder/.* .

Dadurch wird der Inhalt des Unterordners in den aktuellen Ordner verschoben. Beachten Sie das Leerzeichen vor dem letzten ".".


es funktioniert aber ich bekomme mv: rename fake/. to ./.: Invalid argumentundmv: rename fake/.. to ./..: Invalid argument
Maslow

16

Dies ist mit folgenden Methoden möglich:

  • Verwenden von rsync:

    rsync -vua --delete-after foo/ .
  • Verwenden cpund rmdir:

    cp -vaR foo/. . && rmdir foo/
  • Verwenden mv(mit dotglobaktivierter Option):

    shopt -s dotglob # Includes filenames beginning with a dot.
    mv -- foo/* .    # Where foo/ is the folder consisting the files.
    shopt -u dotglob # Disables previously enabled dotglob option.

    Wo foo/ist Ihr Ordner, dessen Inhalt eine Ebene nach oben verschoben werden soll?

    Siehe: help shoptund man bash.

  • Verwendung mv(wie hier vorgeschlagen ):

    mv foo/* foo/.[^.]* . && rmdir foo/

    Hinweis: Eine aufgerufene Datei würde fehlen foo/..bar...

    Hinweis: Für POSIX-Shells benötigen Sie [!.].


Was ist der rsync - Schalter -v, -u, -aund zu -rtun? AFAICT -vist ausführlich, wodurch rsync nur mehr Informationen ausgibt . -ubedeutet Update - kopiere eine Datei nur, wenn sie neuer ist. Das scheint nicht relevant zu sein. -abedeutet Archiv. Dadurch werden der Eigentümer und die Berechtigungen der Datei kopiert und die Synchronisierung rekursiv. -rbedeutet rekursiv, aber das ist bereits abgedeckt durch -a.
rjmunro

-uDies ist nützlich, wenn Sie keine zusätzliche Zeit für das Verschieben von Daten aufwenden möchten, die bereits vorhanden sind (insbesondere für langsame Speichergeräte). Ich habe entfernt -r, da es von -awie Sie erwähnt abgedeckt ist .
Kenorb

1
mv foo/* foo/.[^.]* .würde eine Datei verpassen, die foo/..bar..zum Beispiel aufgerufen wird . Beachten Sie, dass Sie für POSIX-Shells benötigen [!.].
Stéphane Chazelas

Es sollte erwähnt werden, dass rsync -vua --delete-after foo/ .alles andere, was möglicherweise bereits im aktuellen Verzeichnis vorhanden ist, gelöscht wird.
David

7

gib einfach einen mv Befehl aus

mv (directory)/* .

Wenn Sie das Verzeichnis löschen möchten, fügen Sie hinzu

rm -rf (directory)

Angenommen, Sie befinden sich in einem übergeordneten Verzeichnis von (Verzeichnis).

Wenn Sie sich in dem (Verzeichnis) befinden, dann

mv * ../

13
Zusätzlicher Sicherheitstipp: Beim Löschen eines Verzeichnisses, von dem Sie wissen, dass es leer sein sollte, wird rmdirbeschwert und beendet, wenn das Verzeichnis nicht leer ist. rm -rStattdessen wird es und der gesamte Inhalt gelöscht. (Es ist ein Poka-Joch .)
Anko

Großartiger Punkt! Ich kann mir keinen Grund vorstellen, es nicht so zu machen.
Mark Lalor

@MarkLalor Ein Grund könnte das Vorhandensein versteckter Dateien sein, wie sie .DS_storein macOS allgegenwärtig sind . Der mvobige Befehl verschiebt diese nicht (ohne dotglobgesetzt).
AkselA

0

Für diejenigen von Ihnen auf einem freigegebenen Server müssten Sie so etwas verwenden

Um die Dateien zu verschieben

mv -v ~/public_html/public_html/* ~/public_html/

So kopieren Sie die Dateien

cp -a ~/public_html/public_html/* ~/public_html/


2
Bei der obigen Frage geht es darum, Inhalte zu verschieben, ohne sie zu kopieren. Dies würde die Dateien duplizieren, indem die Originale in einem Unterordner belassen werden. Auch ein "geteilter" Server zu sein oder nicht, hat nichts damit zu tun.
Caleb

1
Ihr Recht und hier ist die Antwort dafür ...
Ricardo Havoc

2
Bezüglich deiner Bearbeitung: Wie unterscheidet sich das von der bereits überstimmten Antwort ? Und was hat ein "Shared Server" damit zu tun? Bitte redigieren Sie , um diese Punkte zu erläutern, wenn dies ein nützlicher Beitrag sein wird, der den Wert dessen, was bereits hier ist, erhöht.
Caleb

1
Ich bin nicht einverstanden, dass der gemeinsam genutzte Server nichts damit zu tun hat. Die Art und Weise, wie das "dir" eingegeben wird, macht einen Unterschied.
Ricardo Havoc

1
Alter, warum bist du so verrückt? ... wow .. Ich habe nur ein bisschen Wissen geteilt. Wir alle verstehen es anders und begegnen unterschiedlichen technischen Problemen auf unterschiedliche Weise ... Guten Tag Caleb ..
Ricardo Havoc
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.