Es muss eine beliebte Frage sein, aber ich konnte keine Antwort finden.
So verschieben Sie alle Dateien über *, einschließlich versteckter Dateien, in das übergeordnete Verzeichnis wie folgt:
mv /path/subfolder/* /path/
Dadurch werden alle Dateien wie erwartet in das übergeordnete Verzeichnis verschoben, versteckte Dateien werden jedoch nicht verschoben. Wie geht das?
cp -r /path/to/source/. /destination
Antworten:
Eine umfassende Reihe von Lösungen hierzu finden Sie in der Antwort von UNIX & Linux auf Wie verschieben Sie alle Dateien (einschließlich versteckter Dateien) von einem Verzeichnis in ein anderes? . Es zeigt Lösungen in Bash, zsh, ksh93, Standard (POSIX) sh usw.
Sie können diese beiden Befehle zusammen verwenden:
Oder alle zusammen ( danke pfnuesel ):
Welches erweitert sich zu:
(Beispiel:
echo a{.,}b
erweitert aufa.b ab
)Beachten Sie, dass hier einige Warnungen angezeigt werden:
Sich einfach ignorieren: dies geschieht , weil
/path/subfolder/{.,}*
auch erweitert zu/path/subfolder/.
und/path/subfolder/..
, die das Verzeichnis und das übergeordnete Verzeichnis (siehe Was tun und „..“ bedeuten , wenn sie in einem Ordner „“? ).Wenn Sie nur kopieren möchten, können Sie nur Folgendes verwenden:
Dadurch werden alle normalen und versteckten Dateien kopiert, da sie
/path/subfolder/.
auf "Alles aus diesem Verzeichnis" erweitert werden (Quelle: Wie kopiere ich mit cp, um versteckte Dateien und versteckte Verzeichnisse sowie deren Inhalt einzuschließen? )quelle
mv /path/subfolder/* /path/subfolder/.* /path/
, nicht unbedingt erforderlich, um die beiden Befehle zu einem zu kombinieren.mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
.
bezeichnet das aktuelle Verzeichnis und..
bezeichnet dasup
Verzeichnis. Sie müssen bemerkt haben, dass alle anderen Dateien verschoben werden.Ich denke, das ist das eleganteste, da es auch nicht versucht, sich zu bewegen
..
:quelle
..anything
oder...anything
usw. vermissen . - stackoverflow.com/a/31438355/2351568 enthält den richtigen regulären Ausdruck für dieses Problem. || aber trotzdemshopt -s dotglob
ist die Verwendung immer noch die bessere Lösung!{a,b}*
würde alle Dateien finden, die mit a oder b beginnen, wie "Anatomie" und "Bulldozer". Die zweite Übereinstimmung ist nur eine leere Übereinstimmung, die entspricht*
, und die erste Übereinstimmung entspricht.[!.]
, wobei die Gruppe[!.]
eine Gruppe bedeutet, die NICHT mit a beginnt.
. Das heißt.*
aber nicht..*
.Sie könnten einschalten
dotglob
:Zum Ausschalten
dotglob
müssen Sie sagen:quelle
man shopt
funktioniert also nicht undhelp shopt
ist sehr kurz. Aber Sie können es tunbashman () { man bash | less -p "^ $1 "; }
und dannbashman shopt
alles direkt lesen. (Möglicherweise muss n gedrückt werden, um zum Befehl zu springen, wenn Zeilen mit shopt beginnen, wie ich festgestellt habe.)ls
Alternative einfachere Lösung ist die Verwendung von
rsync
Dienstprogramm:Hinweis: Der obige Befehl zeigt an, was geändert werden soll. Entfernen Sie, um die tatsächlichen Änderungen auszuführen
--dry-run
.Der Vorteil ist, dass der ursprüngliche Ordner (
subfolder
) ebenso wie ein Teil des Befehls entfernt wird. Wennmv
Sie hier Beispiele verwenden, müssen Sie Ihre Ordner noch bereinigen, ganz zu schweigen von zusätzlichen Kopfschmerzen, um versteckte und nicht versteckte Dateien in einem einzigen zu behandeln Muster.Darüber hinaus wird
rsync
das Kopieren / Verschieben von Dateien zwischen Fernbedienungen unterstützt, und es wird sichergestellt, dass Dateien genau so kopiert werden, wie sie ursprünglich waren (-a
).Der verwendete
-u
Parameter würde vorhandene neuere Dateien überspringen,-r
in Verzeichnisse zurückkehren und-v
die Ausführlichkeit erhöhen.quelle
sudo
und hinzugefügt--dry-run
, damit die Benutzer die Änderungen testen können, bevor sie den eigentlichen Befehl ausführen, um mögliche Probleme zu vermeiden.Lassen Sie mich Ihnen meinen Freund "dotglob" vorstellen. Es wird ein- und ausgeschaltet, ob "*" versteckte Dateien enthält oder nicht.
Der Standardwert ist "Aus".
Es ist am besten, es wieder einzuschalten, wenn Sie fertig sind, sonst verwirren Sie Dinge, die davon ausgehen, dass es ausgeschaltet ist.
quelle
Wenn Sie den
find
Befehl in Verbindung mit demmv
Befehl verwenden, können Sie verhindern, dass dermv
Befehl versucht, Verzeichnisse (z. B...
und.
) und Unterverzeichnisse zu verschieben. Hier ist eine Option:Bei einigen anderen Antworten treten Probleme auf. Beispielsweise versucht jedes der folgenden Elemente, Unterverzeichnisse aus dem Quellpfad zu verschieben:
Auch 2) enthält die. und .. Dateien und 3) fehlen Dateien wie ..foobar, ... barfoo usw.
Sie könnten verwenden,
mv /source/path/{.[!.],..?,}* /destination/path
was die von 3) fehlenden Dateien enthalten würde, aber es würde immer noch versuchen, Unterverzeichnisse zu verschieben. Die Verwendung desfind
Befehls mit demmv
oben beschriebenen Befehl beseitigt alle diese Probleme.quelle
Meine Lösung für dieses Problem, wenn ich alle Dateien (einschließlich
.
Dateien) in ein Zielverzeichnis kopieren muss, in dem die Berechtigungen erhalten bleiben, lautet: (überschreiben, falls bereits vorhanden)yes
dient zum automatischen Überschreiben von Zieldateien,r
rekursiv,v
ausführlich und zump
Beibehalten von Berechtigungen.Beachten Sie, dass der Quellpfad nicht mit a endet
/
(daher werden alle Dateien / Verzeichnis- und. -Dateien kopiert).Das Zielverzeichnis endet mit dem
/
Platzieren des Inhalts des Quellordners auf dem gesamten Ziel.quelle
yes
ist zwar ein großartiger Befehl, wenn Sie Zieldateien überschreiben möchten, dies ist jedoch nicht immer erwünscht. Verwenden Sie es nur, wenn Sie sicher sind, dass Sie dies tun möchten. Gibt es auch einen Unterschied zwischenyes | cp ...
undcp -f ...
?