GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie verschiebt man alle Dateien vom aktuellen Verzeichnis in das obere Verzeichnis?

Der gesuchte Befehl ist

mv * .[^.]* ..

oder (weitere Informationen siehe unten):

(shopt -s dotglob; mv -- * ..)

Erklärung:der mv Befehl verschiebt Dateien und Verzeichnisse. Das letzte Argument für mv ist das Ziel (in diesem Fall das Verzeichnis eine Stufe "oben" im Baum, .. ). Die Argumente davor sind die Quelldateien und -verzeichnisse. Das Sternchen (* ) ist ein Platzhalter, der auf alle Dateien passt, die nicht mit einem Punkt beginnen. Dateien, die mit einem Punkt beginnen (dotfiles), sind „versteckt“. Sie werden nach dem Muster .[^.]* abgeglichen (siehe Bearbeitung unten).

Weitere Informationen zu mv finden Sie auf der von mir verlinkten Manpage .

Warum .[^.]* statt .* ?

Wie Chris Johnsen richtig betont:das Muster .* passt auch zu . und .. . Da Sie diese nicht verschieben wollen (und können), ist es besser, ein Muster zu verwenden, das mit jedem Dateinamen übereinstimmt, der mit einem Punkt beginnt außer diesen beiden . Das Muster .[^.]* tut genau das:es passt auf jeden Dateinamen (1), der mit einem Punkt (2) beginnt, gefolgt von einem Zeichen, das nicht ist ein Punkt (3) gefolgt von null oder mehr beliebigen Zeichen.

Wie Paggas betont, müssten wir auch das Muster .??* hinzufügen um Dateien abzugleichen, die mit zwei Punkten beginnen. Siehe seine Antwort für eine alternative Lösung mit find .

Arjans Antwort erwähnt shopt um all diese Probleme mit dotfiles zu vermeiden. Aber dann gibt es immer noch das Problem mit Dateien, die mit einem Bindestrich beginnen. Und es erfordert drei Befehle. Trotzdem gefällt mir die Idee. Ich schlage vor, es so zu verwenden:

(shopt -s dotglob; mv -- * ..)

Dies führt shopt aus in einer Subshell (also kein zweiter Aufruf von shopt erforderlich) und verwendet -- damit Dateien, die mit einem Bindestrich beginnen, nicht als Argumente für mv interpretiert werden .


Kurze Antwort:Verwenden Sie

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

Lange Antwort:

Der Befehl

mv * .* ..

funktioniert nicht seit .* kann mit . übereinstimmen und .. . Aber der Befehl

mv * .[^.]* ..

wird auch nicht funktionieren, da .[^.]* passt nicht, z. B. ..filename ! Was ich stattdessen tue, ist

mv * .[^.] .??* ..

was mit allem übereinstimmt außer . und .. . * findet alles, was nicht mit . beginnt , .[^.] stimmt mit allen 2-stelligen Dateinamen überein, die mit einem Punkt beginnen, außer .. , und .??* stimmt mit allen Dateinamen überein, die mit einem Punkt mit mindestens 3 Zeichen beginnen.

Besser noch, Sie können

verwenden
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

was die hässlichen Glob-Hacks in mv * .[^.] .??* .. vermeidet !


Nur der Vollständigkeit halber kann man der Bash-Shell auch mit shopt mitteilen, versteckte Dateien einzubinden :

shopt -s dotglob
mv -- * ..
shopt -u dotglob

Linux
  1. Wie verwende ich Wget, um rekursiv Dateien aus einem Webverzeichnis herunterzuladen?

  2. Alle Dateien in einem Ordner drucken?

  3. Wie verschiebe ich alle Java-Quelldateien in ihr jeweiliges Paketverzeichnis?

  4. Wie verschiebt (und überschreibt) man alle Dateien von einem Verzeichnis in ein anderes?

  5. So ändern Sie alle Vorkommen eines Wortes in allen Dateien in einem Verzeichnis

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

Wie listet man kürzlich gelöschte Dateien aus einem Verzeichnis auf?

Wie chown/chmod alle Dateien im aktuellen Verzeichnis?

So finden Sie alle Null-Byte-Dateien im Verzeichnis

Wie erstellt man symbolische Links zu allen Dateien (Dateiklassen) in einem Verzeichnis?

Wie kann ich alle Dateien aus einem Verzeichnis löschen, wenn die Argumentliste zu lang gemeldet wird?