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:
mv /path/subfolder/* /path/
Dadurch werden alle Dateien wie erwartet in das übergeordnete Verzeichnis verschoben, versteckte Dateien jedoch nicht. Wie geht das?
Antworten:
135 für die Antwort № 1Ein umfassendes Lösungspaket hierzu finden Sie in der Antwort von UNIX & Linux auf Wie verschieben Sie alle Dateien (einschließlich versteckter) 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:
mv /path/subfolder/* /path/ # your current approach
mv /path/subfolder/.* /path/ # this one for hidden files
Oder alle zusammen (danke pfnuesel):
mv /path/subfolder/{.,}* /path/
Welches erweitert sich zu:
mv /path/subfolder/* /path/subfolder/.* /path/
(Beispiel: echo a{.,}b
expandiert nach a.b ab
)
Beachten Sie, dass hier einige Warnungen angezeigt werden:
mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory
Ignoriere sie einfach: das passiert, weil /path/subfolder/{.,}*
erweitert auch um /path/subfolder/.
und /path/subfolder/..
, die das Verzeichnis und das übergeordnete Verzeichnis sind (siehe Was bedeuten "." Und ".." in einem Ordner?).
Wenn Sie nur kopieren möchten, können Sie Folgendes verwenden:
cp -r /path/subfolder/. /path/
# ^
# note the dot!
Dadurch werden alle Dateien kopiert, sowohl normale als auch versteckte /path/subfolder/.
erweitert auf "alles aus diesem Verzeichnis" (Quelle: Wie kopiere ich mit cp, um versteckte Dateien und versteckte Verzeichnisse und deren Inhalt einzuschließen?)
24 für die Antwort № 2
Dadurch werden alle Dateien wie erwartet in das übergeordnete Verzeichnis verschoben versteckte Dateien nicht verschieben. Wie geht das?
Sie könnten einschalten dotglob
:
shopt -s dotglob # This would cause mv below to match hidden files
mv /path/subfolder/* /path/
Um auszuschalten dotglob
müssen Sie sagen:
shopt -u dotglob
23 für die Antwort № 3
Ich finde das am elegantesten, da es auch nicht versucht sich zu bewegen ..
:
mv /source/path/{.[!.],}* /destination/path
3 für die Antwort № 4
Alternative einfachere Lösung ist zu verwenden rsync
Nützlichkeit:
rsync -vuar --delete-after path/subfolder/ path/
Der Vorteil ist, dass der ursprüngliche Ordner (subfolder
) würde ebenso wie ein Teil des Befehls entfernt und bei der Verwendung von mv
In diesen Beispielen müssen Sie Ihre Ordner noch bereinigen, ganz zu schweigen von zusätzlichen Kopfschmerzen, um verborgene und nicht verborgene Dateien in einem einzigen Muster abzudecken.
In Ergänzung rsync
Unterstützt das Kopieren / Verschieben von Dateien zwischen Remotes und stellt sicher, dass die Dateien genauso kopiert werden, wie sie ursprünglich waren (-a
).
Das benützte -u
Parameter würde vorhandene neuere Dateien überspringen, -r
rekurs in verzeichnisse und -v
würde die Ausführlichkeit erhöhen.
1 für die Antwort № 5
Darf ich Ihnen meinen Freund "dotglob" vorstellen? Es wird ein- und ausgeschaltet, ob "*" versteckte Dateien enthält oder nicht.
$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. .. .den .hi .hidden a b c
$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c
$ shopt -s dotglob
$ ls *
.den .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c
Die Standardeinstellung ist "Aus".
$ shopt dotglob
dotglob off
Es ist am besten, es wieder einzuschalten, wenn Sie fertig sind, sonst werden Sie Dinge verwirren, die annehmen, dass es ausgeschaltet sein wird.
1 für die Antwort № 6
Durch die Verwendung der find
Befehl in Verbindung mit dem mv
Befehl können Sie die verhindern mv
Befehl aus dem Versuch, Verzeichnisse zu verschieben (z. ..
und .
) und Unterverzeichnisse. Hier ist eine Option:
find /path/subfolder -maxdepth 1 -type f -name "*" -exec mv -n {} /path ;
Bei einigen anderen Antworten treten Probleme auf. Beispielsweise versucht jede der folgenden Methoden, Unterverzeichnisse aus dem Quellpfad zu verschieben:
1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/
3) mv /source/path/{.[!.],}* /destination/path
Auch 2) beinhaltet die. und .. Dateien und 3) vermisst Dateien wie ..foobar, ... barfoo, etc.
Du könntest benutzen, mv /source/path/{.[!.],..?,}* /destination/path
, was die durch 3) fehlenden Dateien einschließen würde, aber es würde immer noch versuchen, Unterverzeichnisse zu verschieben. Verwendung der find
Befehl mit dem mv
Der oben beschriebene Befehl beseitigt alle diese Probleme.
1 für die Antwort № 7
Meine Lösung für dieses Problem, wenn ich muss Kopieren Sie alle Dateien (einschließlich .
Dateien) in ein Zielverzeichnis Beibehaltung der Berechtigungen is: (überschreiben, falls bereits vorhanden)
yes | cp -rvp /source/directory /destination/directory/
yes
dient zum automatischen Überschreiben von Zieldateien,
r
rekursiv,
v
wortreich,
p
Berechtigungen behalten.
Beachten Sie, dass die Quellpfad endet nicht mit a /
(so werden alle files / directory und .files kopiert)
Zielverzeichnis endet mit /
da wir den Inhalt des Quellordners zum Ziel als Ganzes platzieren.