/ / Verschieben aller Dateien, einschließlich versteckter Dateien, in das übergeordnete Verzeichnis über * - Linux, Bash, Shell, Befehl

Wie man alle Dateien einschließlich versteckter Dateien über * - linux, bash, shell, command in das übergeordnete Verzeichnis verschiebt

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 № 1

Ein 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 dotglobmü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.