Wie verschiebe ich alle Dateien vom aktuellen Verzeichnis in das übergeordnete Verzeichnis unter Linux?
Ich habe so etwas versucht mv *.*
, aber es funktioniert nicht.
Wie verschiebe ich alle Dateien vom aktuellen Verzeichnis in das übergeordnete Verzeichnis unter Linux?
Ich habe so etwas versucht mv *.*
, aber es funktioniert nicht.
Antworten:
Der gesuchte Befehl lautet
mv * .[^.]* ..
oder (siehe unten für weitere Informationen):
(shopt -s dotglob; mv -- * ..)
Erläuterung: Der mv
Befehl verschiebt Dateien und Verzeichnisse. Das letzte Argument mv
ist das Ziel (in diesem Fall das Verzeichnis, das einen Schritt weiter oben in der Baumstruktur steht ..
). Die Argumente davor sind die Quelldateien und -verzeichnisse. Das Sternchen ( *
) ist ein Platzhalter, der allen Dateien entspricht, die nicht mit einem Punkt beginnen. Dateien, die mit einem Punkt beginnen (Punktdateien), werden "ausgeblendet". Sie werden anhand des Musters abgeglichen .[^.]*
(siehe Bearbeitung unten).
Weitere Informationen finden Sie auf der von mir verlinkten Manpage mv
.
.[^.]*
statt .*
?Wie Chris Johnsen richtig betont: Das Muster .*
stimmt auch mit .
und überein ..
. Da Sie diese nicht verschieben möchten (und können), ist es besser, ein Muster zu verwenden, das jedem Dateinamen entspricht, der mit einem Punkt beginnt, außer diesen beiden . Das Muster .[^.]*
macht genau das: Es stimmt mit jedem Dateinamen (1) überein, beginnend mit einem Punkt (2), gefolgt von einem Zeichen, das kein Punkt (3) ist, gefolgt von null oder mehr beliebigen Zeichen.
Wie Paggas weist darauf hin , würden wir müssen auch das Muster hinzufügen , .??*
um Dateien mit zwei Punkten beginnen zu lassen. Siehe seine Antwort für eine alternative Lösung mit find
.
Arjans Antwort erwähnt shopt
, um all diese Probleme mit Punktdateien zu vermeiden. Aber dann gibt es immer noch das Problem mit Dateien, die mit einem Bindestrich beginnen. Und es erfordert drei Befehle. Trotzdem gefällt mir die Idee. Ich schlage vor, es so zu benutzen:
(shopt -s dotglob; mv -- * ..)
Dies wird shopt
in einer Subshell ausgeführt (daher kein zweiter Aufruf shopt
erforderlich) und verwendet, --
damit Dateien, die mit einem Bindestrich beginnen, nicht als Argumente für interpretiert werden mv
.
.*
dazu führen, dass mv Warnungen / Fehler ausgibt , die darauf hinweisen , dass sich .
und nicht bewegen können ..
. Sie könnten es mv * .[^.]* ..
stattdessen versuchen .
*
, .[^.]*
und ..?*
. Die zweite vielleicht .[!.]*
für ältere (POSIX) Shells. Lesen Sie auch
Kurze Antwort: verwenden
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Lange Antwort:
Der Befehl
mv * .* ..
wird nicht funktionieren, da .*
kann .
und passen ..
. Aber der Befehl
mv * .[^.]* ..
wird auch nicht funktionieren, da .[^.]*
passt zB nicht ..filename
! Stattdessen mache ich
mv * .[^.] .??* ..
das passt zu allem außer .
und ..
. *
wird alles passen, der nicht mit einem Start .
, .[^.]
mit einem Punkt wird außer daß alle 2 - Zeichen Dateinamen übereinstimmen ..
, und .??*
wird mit einem Punkt mit mindestens 3 Zeichen beginnen alle Dateinamen entsprechen.
Besser noch, Sie können verwenden
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
das vermeidet die hässlichen glob hacks in mv * .[^.] .??* ..
!
..?*
meinen Kommentar hinzuzufügen , und du hast dich bereits darum gekümmert.
mv
an, keine weiteren Befehlsoptionen mehr zu suchen. Die geschweiften Klammern ergeben einen Dateinamen. Das Pluszeichen besagt, dass anstelle der Ausführung von exec pro Ergebnis (dh pro Dateiname) so viele Ergebnisse wie möglich in einem einzigen exec abgelegt werden. Der Vollständigkeit -t..
halber wird gesagt, dass das Ziel verschoben werden soll, um alle diese Dateien zu verschieben.
Der Vollständigkeit halber kann man der Bash-Shell auch anweisen, versteckte Dateien einzuschließen, indem man verwendet shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
Dem mv fehlt die Funktionalität, versteckte Dateien bei der Verwendung zu verschieben *
- warum also nicht stattdessen kopieren?
cp -rf . ..
rm -rf *
Keine Notwendigkeit, sich mit komplexen Lösungen für das Aufsplittern und Verwenden von Suchbefehlen zu befassen.
rsync -a --remove-source-files . ..
rsync
ist ein äußerst leistungsfähiges Tool zum Kopieren von Dateien, das im Allgemeinen zur Durchführung effizienter inkrementeller Remote-Sicherungen und -Spiegelungen verwendet wird.
Mit dem obigen Befehl sagen wir, dass rsync
der Inhalt von .
in kopiert werden soll..
Der Schalter -a
ermöglicht die Rekursion in .
Unterverzeichnisse und aktiviert einige andere allgemeine Optionen.
Der Schalter --remove-source-files
weist rsync an, die Quelldateien nach einer erfolgreichen Kopie zu entfernen, dh rsync verhält sich ähnlich wie der mv
Befehl.
--remove-source-files
(synchronisierte) Verzeichnisse nicht entfernt werden.
-bash: /bin/mv: Argument list too long
Fehler. Dieser arbeitet wie der Charme.
Letztendlich wird der Versuch mv .
scheitern, weil mv mv * ..
die Verknüpfung zu dem Verzeichnis, in dem Sie sich gerade befinden, nicht aufheben kann. Sie können die Dateien in der CWD verschieben.
mv * .??* ../.
*
Ruft alle Nicht-Punkt-Dateien ab. .??*
bekommt alles. Mindestens drei Bytes lange Dateien, die für alle legitimen funktionieren. Alles, was Sie übrig haben, möchten Sie wahrscheinlich rm
lieber als mv
irgendwie.
Das ../.
bietet keine direkten Vorteile gegenüber, ..
aber wenn Sie ein Verzeichnis wechseln, ist es eine sehr gute Angewohnheit, sich darauf einzulassen, da es nach Belieben fehlschlägt, wenn etwas mit dem Pfad nicht stimmt. Wenn Sie beispielsweise glaubenmv xyz bletch
, dass bletch
es sich um ein Verzeichnis handelt, können Sie mit sicherer werden mv xyz bletch/.
.
.[^.]
, um Cover-Dateien wie zu erhalten .a
.
Dieser minimierte Befehl funktioniert auf den meisten modernen Shells:
\mv -- {,.{[^.],??}}* ..
Ansonsten wird eine portable Lösung genannt:
\mv -- * .[^.] .??* ..
Eigenschaften:
\ verhindert, dass Aliase sich unerwünscht verändern.
- Verhindert, dass Dateinamen mit führenden Bindestrichen (-xyz) als Befehlszeilenargumente interpretiert werden.
. [^.] stimmt mit allen zwei Zeichendateinamen überein, die mit. außer ..
. ?? * stimmt mit allen anderen Dateinamen überein, die mindestens drei Zeichen lang sind.
Naive Implementierungen:
Bei den folgenden Schritten werden versteckte UNIX-Dateinamen übersprungen, die mit "" beginnen. (.bashrc).
mv * ..
Die folgenden Übereinstimmungen .., die rekursiv versuchen, jedes Verzeichnis irgendwann ganz nach / in .. des aktuellen Arbeitsverzeichnisses ($ PWD oder pwd) zu verschieben. Benutze niemals.
mv .* ..
Es ist korrekter, das Muster zu verwenden, * .[!.] .??*
als dies der Fall ist, * .[^.] .??*
da das erstere auch mit älteren Shells wie ksh88 funktioniert:
mv -- * .[!.] .??* ..
--
Verhindert Probleme, wenn Sie einen Dateinamen haben, der mit beginnt -
*
stimmt mit allen Dateinamen überein, die nicht mit einem beginnen .
.
den Sie verschieben können / sollten.[!.]
stimmt mit allen Dateinamen mit zwei Zeichen überein, die mit einem beginnen .
.??*
stimmt mit allen drei (oder längeren) Dateinamen überein, die mit a beginnen .
Mit ksh88 wird das Dateinamenmuster .[^.]
tatsächlich mit den Dateinamen ..
(die immer existieren) und .^
(die wahrscheinlich nicht existieren) übereinstimmen , was eine entgegengesetzte Wirkung hat, als es gewünscht wird.
Finden und arbeiten auch. Diese Art von Struktur kann hilfreich sein, wenn Sie Dateien nach komplexeren Kriterien auswählen möchten, indem Sie find und egrep ändern.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
Ich denke, die einfachste Lösung zum Verschieben aller Dateien in das übergeordnete Verzeichnis. wäre
mv "`ls`" ../
oder, Wenn versteckte Dateien / Verzeichnisse vorhanden sind
verwenden:
mv "`ls -a`" ../ 2>/dev/null
Nehmen wir an, Sie möchten den Inhalt eines Ordners in einen der internen Ordner verschieben (z. B.).
verwenden:
mv "`ls -a`" /tony 2>/dev/null
Hinweis:
"`ls -a`"
Verschieben von Dateien mit Leerzeichen.
2>/dev/null
Ist für die Warnung / Fehler unterdrückt , weil ls -a
der Druck würde .
und ..
Ordner , wie gut und man kann nicht verschoben oder kopiert werden . Für diese Ordner wird der Fehler angezeigt (wenn wir nicht 2> / dev / null verwenden), dass sie nicht verschoben werden können, und der Rest wird ganz bequem verschoben.
Am besten meiden, ls -a
wenn es keine versteckten Dateien gibt und nur benutzen ls
.
mv $(ls -a)
? Das würde auf das aktuelle Verzeichnis und das darunter liegende Verzeichnis tippen, da ls -a
es ebenfalls ausgegeben wird ..
.
mv ls -a ../
aber auch nach Bedarf geklappt, Ja es werden die oben genannten Fehler angezeigt aber ansonsten werden die benötigten Ordner / Dateien in das übergeordnete Verzeichnis verschoben.
ls
Befehl in doppelte Anführungszeichen setzen, um Dateien mit Leerzeichen zu verschieben. Ich habe die erforderlichen Änderungen vorgenommen. Danke für den Hinweis.
[linux] [mv] [cwd] [files]
etwas Ähnliches vorschlagen ?