it-swarm.com.de

So verschieben Sie alle Dateien einschließlich versteckter Dateien in das übergeordnete Verzeichnis über *

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?

100
TroodoN-Mike

Eine umfassende Liste von Lösungen 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 alles zusammen ( danke pfnuesel ):

mv /path/subfolder/{.,}* /path/

Welches erweitert sich zu:

mv /path/subfolder/* /path/subfolder/.* /path/

(Beispiel: echo a{.,}b erweitert auf 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 sich auch zu /path/subfolder/. und /path/subfolder/.., das sind das Verzeichnis und das übergeordnete Verzeichnis (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!

Dies kopiert alle Dateien, sowohl normale als auch versteckte, seit /path/subfolder/. erweitert sich zu "Alles aus diesem Verzeichnis" (Quelle: Wie kopiert man mit cp, um versteckte Dateien und versteckte Verzeichnisse und deren Inhalt einzuschließen? )

184
fedorqui

Dadurch werden alle Dateien wie erwartet in das übergeordnete Verzeichnis verschoben, versteckte Dateien jedoch nicht. Wie geht das?

Sie könnten dotglob einschalten:

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

Um dotglob auszuschalten, müssen Sie sagen:

shopt -u dotglob
28
devnull

Ich denke das ist das eleganteste, da es auch nicht versucht sich zu bewegen ..:

mv /source/path/{.[!.],}* /destination/path
26
Vanderstaaij

Eine andere einfachere Lösung ist die Verwendung des Dienstprogramms rsync:

rsync -vuar --delete-after path/subfolder/ path/

Der Vorteil ist, dass der ursprüngliche Ordner (subfolder) ebenso entfernt wird wie ein Teil des Befehls, und wenn Sie hier Beispiele für mv verwenden, müssen Sie Ihre Ordner noch bereinigen, ganz zu schweigen von zusätzlichen Kopfschmerzen, um versteckte und nicht versteckte Dateien in einem einzigen Muster abzudecken.

Außerdem unterstützt rsync das Kopieren/Verschieben von Dateien zwischen Remotes und stellt sicher, dass die Dateien genauso kopiert werden, wie sie ursprünglich waren (-a).

Das gebrauchte -u Parameter würde vorhandene neuere Dateien überspringen, -r Recurse in Verzeichnisse und -v würde die Ausführlichkeit erhöhen.

4
kenorb

Indem Sie den Befehl find in Verbindung mit dem Befehl mv verwenden, können Sie verhindern, dass der Befehl mv versucht, Verzeichnisse zu verschieben (z. B. .. 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, der die Dateien enthält, die 3) übersehen haben, aber trotzdem versucht, Unterverzeichnisse zu verschieben. Die Verwendung des Befehls find mit dem oben beschriebenen Befehl mv beseitigt alle diese Probleme.

3
teancum144

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.

2
TomOnTime

Meine Lösung für dieses Problem, wenn ich alle Dateien kopieren (einschließlich . - Dateien) in ein Zielverzeichnis die Berechtigungen beibehalten muss, lautet: (überschreiben, wenn bereits existiert)

yes | cp -rvp /source/directory /destination/directory/

yes dient zum automatischen Überschreiben von Zieldateien, r rekursiv, v ausführlich, p zum Beibehalten von Berechtigungen.

Beachten Sie, dass der Quellpfad nicht mit / Endet (damit alle Dateien/Verzeichnisse und .dateien kopiert werden)

Zielverzeichnis endet mit /, da wir den Inhalt des Quellordners zum Ziel als Ganzes verschieben.

1
Rajneesh Gadge