Ich migriere mein Home-Verzeichnis von einem alten auf ein neues System, und der von mir erstellte Tarball enthält alles, einschließlich versteckter Dateien wie .bashrc. Wenn ich jedoch den Inhalt des entpackten Tarballs (der sich in / tmp befindet) in mein neues Ausgangsverzeichnis verschiebe, werden die versteckten Dateien nicht kopiert ( mv /tmp/home/rcook/* /home/rcook/
). Wie kann ich mv dazu bringen, sie zu bewegen?
Eigentlich glaube ich, dass das Problem nicht bei mv liegt, sondern bei bashs Globbing. Wenn ich das mache:
mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/
Ich sehe es:
a/:
. .. .foo
b/:
. .. bar
a/.foo
bewegte sich nicht. Wie kann ich den Platzhalter * zum Auffinden versteckter Dateien verwenden?
Ja, ich nehme an, ich könnte den Tarball direkt in mein Home-Verzeichnis dekomprimieren, aber der Tarball wird in dekomprimiert home/rcook/...
, und ich möchte sicher sein, dass ich den neuen .bashrc
usw. mit den alten angepassten Versionen überschreibe und weiß, wie man versteckte Dateien findet und verschiebt ist eine lohnende Fähigkeit. Vorschläge?
Einige Antworten schlagen vor, so etwas zu tun mv src/.* dest/
. Ich habe dies jedoch in meinen Testverzeichnissen versucht und Fehler festgestellt. Beginnen mit:
rcook$ ls -a a/ b/
a/:
. .. bar .foo
b/:
. ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
. .. bar
b/:
. .. .foo
Was mache ich falsch?
quelle
Antworten:
Du kannst das :
Du kannst Geben
in Ihrem,
~/.bashrc
wenn Sie möchten, dass es die Standardeinstellung ist.Siehe http://mywiki.wooledge.org/glob
Ein anderer Ansatz zum Kopieren der Punktedateien:
Verwenden Sie das Muster nicht so,
..*
wie es passt..
(Zeiger auf das übergeordnete Verzeichnis). Wenn es Dateien gibt, deren Name mit zwei Punkten (..something
) beginnt , verwenden Sie auch das Muster..?*
.quelle
.
und..
ist specials dirs: jeweils aktuelles Verzeichnis & Elternverzeichnis . Es ist nur eine Warnung. Bessereshopt -s dotglob
Lösungmv home/rcook/* /home/rcook/
gefolgt vonmv home/rcook/.* /home/rcook/
. Dies hat den Trick gemacht, obwohl ich wünschte, ich wäre dem Link gefolgt und hätte zuerst etwas über den Dotglob-Modus gelesen. Es hätte mich einen Schritt gerettet. +1zsh
, können Sie dasD
Globbing-Qualifikationsmerkmal oder dieGLOB_DOTS
Shell-Option verwenden .In Ihren Ergänzungen haben Sie Fehler erhalten, aber der Code hat noch funktioniert. Das einzige, was Sie hinzufügen müssen, ist, dass Sie angegeben haben, dass nur die Punktedateien kopiert werden sollen. Versuchen:
Sie erhalten weiterhin die Fehler für die. und .. Einträge, was in Ordnung ist. Aber der Umzug sollte gelingen.
quelle
.hidden
Datei verschoben, die ich explizit hatte, um mein Problem zu lösen.|| :
(||
bedeutet, bei false / error Folgendes ausführen,:
ist noop-Befehl). Das würde aber auch legitime Fehler unterdrücken, zB Zielordner existiert nicht. Ich kann keinen eleganteren Weg findenmv
, um die.
und..
-Einträge auszuschließen . Hintern großes Plus für mich über CP schreibt keine neuen Dateien auf die Festplatte.Wenn Sie sich
ls -l
in einem Verzeichnis befinden, sehen Sie.
und..
unter aufgelisteten Dateien. Also, ich denke,mv .* /dest
berücksichtigt diese Hinweise. Versuchen:Dadurch werden die aktuellen und übergeordneten Verzeichniszeiger ignoriert.
Sie erhalten einen Fehler , wenn eine der drei Muster erhalten
*
,[^.]*
oder..?*
passen keine Datei, so dass Sie sollten nur schließen diejenigen , die passen.quelle
Zwei mögliche Lösungen, die ich mir vorstellen kann. Die erste besteht darin, stattdessen cp mit seiner rekursiven Option zu verwenden und das aktuelle Verzeichnis in das Zielverzeichnis zu kopieren.
dann können Sie die Quelldateien im aktuellen Verzeichnis entfernen
Wenn Sie wissen, dass die Dateien einen korrekten Namen haben (keine Leerzeichen, Platzhalter, nicht druckbare Zeichen), können Sie auch so etwas tun
quelle
-p
zum Beibehalten von Metadaten hinzu. Verwendenls
sollte ein letzter Ausweg sein, und hier gibt es bessere, einfachere Wege.Unter Linux gibt es eigentlich keine "versteckten" Dateien. Dateien, die mit einem Punkt beginnen, werden standardmäßig nur in den Dateilisten ausgeblendet.
Um Dateien auch mit einem glob zu kopieren, müssen Sie die Datei mit Präfix
.
wiemv -u .* foo
und dann.foo
werden appearn alsfoo/.foo
wenn er bewegt wird .Die Option -u verschiebt die Dateien nur, wenn die Quelle neuer ist oder das Ziel fehlt. Oder Sie könnten nur die Fehler ignorieren zu bewegen
.
und..
wie sie spezielle Dateien sind und können nicht verschoben werden, aber nicht in dem gefangen.*
von dem Shell Glob.quelle
Also haben wir:
und:
Ich habe mir sehr viel Zeit genommen, um eine bessere Lösung zu finden als alle Antworten hier.
Dann habe ich 30 Sekunden für diesen Befehl gebraucht:
Dann habe ich meine Liebe gefunden:
Hinweis: Ich verstehe das Argument nicht einmal
-T
. Es hat einfach getan, was ich brauchte. Hier heißt es:quelle
-T
. In beiden Fällen bedeutet dies im Wesentlichen, dass mv das Verzeichnis selbst und nicht alle darin enthaltenen Dateien verschieben soll.In meinem Fall habe ich einfach versucht,
mv
eine einzelne versteckte Datei zu finden, und dies war die Lösung:Erläuterung
Zuerst habe ich versucht:
Aber es verursachte weiterhin den Fehler:
Obwohl ein
ls -al
zeigte, dass die Datei unddest/
existierte.Der Grund scheint darin zu liegen, dass die Shell das "." Wenn Sie die Datei also in eine Variable verschieben, wird die Interpretation vermieden. Es gibt wahrscheinlich andere Möglichkeiten, dies zu lösen, aber das hat uns gereicht.
quelle
Wenn Sie Dateien einschließlich versteckter Dateien in das aktuelle Verzeichnis kopieren möchten, in dem Sie sich befinden.
quelle