Ich habe ein Verzeichnis, das ich versuche zu bereinigen, das sowohl Dateien als auch Unterverzeichnisse enthält. Was ich versuche, ist einfach: Alle Dateien in ein anderes Verzeichnis verschieben, aber alle Unterverzeichnisse so lassen, wie sie sind.
Ich denke etwas wie:
mv [*_but_no_dirs] ./other_directory
Es scheint, dass es eine einfache Möglichkeit geben sollte, dies mit Platzhaltern *
und Regex zu tun ...
Hat jemand Ideen?
mv **/*(.) ./other_directory
- mit bash müsste man allerdings auf externe Befehle wie zurückgreifenfind
.Antworten:
Regex sind hier nicht beteiligt. Platzhalter in Bash (wie die meisten anderen Shells) stimmen nur mit Dateien überein, die auf den Dateinamen basieren, nicht auf dem Dateityp oder anderen Merkmalen. Es gibt eine Möglichkeit, nach Typ zu suchen: Durch Hinzufügen
/
am Ende des Musters werden nur Verzeichnisse oder symbolische Links zu Verzeichnissen gesucht. Auf diese Weise können Sie Verzeichnisse verschieben, dann verschieben, was übrig ist, und Verzeichnisse zurück verschieben - umständlich, aber es funktioniert.Eine Standardmethode zum Abgleichen von Dateien nach Typ ist das Aufrufen
find
.In zsh können Sie Glob-Qualifizierer verwenden , um Dateien nach Typ abzugleichen . Das
.
Qualifikationsmerkmal entspricht regulären Dateien. Verwenden Sie^/
diese Option, um alle Nicht-Verzeichnisse abzugleichen oder-^/
auch symbolische Links zu Verzeichnissen einzuschließen.In jeder Shell können Sie einfach eine Schleife ausführen.
quelle
Du könntest so etwas gebrauchen
Zuerst
find
schauen wir nur innerhalb des aktuellen Verzeichnisses nach, dann ignorieren wir Verzeichnisse, indem! -type d
wir schließlich ausführensh
und alles in das Zielverzeichnis verschieben. Sie könnten{} +
am Ende versuchen, was schneller sein wird.quelle
-exec sh -c 'mv "$@" MYDIR' _ {} \;
eher als vor-exec mv {} MYDIR \;
? Nur um etwas zu bekommen, das durch Ändern der\;
zu einem rationalisiert werden kann+
? Das können Sie mit dem-exec mv -t MYDIR {} +
Formular machen.-t
Flagge. Ich habe auch in der Antwort erklärt, dass das+
schneller ist, aber nicht allefind
Versionen es unterstützen. Der obige Code ist also ziemlich kompatibel mit jeder verwendetenfind
Shell.find
Shell.” Richtig, aber so ist esfind … -exec mv {} MYDIR \;
und das verbraucht weniger Ressourcen als… -exec sh -c 'mv "$@" MYDIR' _ {} \;
.Es ist möglicherweise ein bisschen gefährlich, aber
Da sowohl cp als auch rm keine Verzeichnisse ohne den Schalter -r bearbeiten.
quelle
Ich würde vorschlagen, einfach
mv *.* destination/
mit Ziel / als den Ordner zu tun , in den Sie verschieben.quelle
*.*
Dadurch werden einige Verzeichnisse verschoben und einige Dateien belassen, was vom Fragesteller nicht gewünscht wird.quelle