Anstatt zu verwenden find
(was die Arbeit gut macht), können Sie auch die Shell zu diesem Zweck verwenden.
Angenommen, Sie möchten alle Dateien von $ PWD bis $ DEST. Der natürliche Versuch wäre:
mv $PWD/* $DEST
Wie funktioniert das? Der Ausdruck "$ PWD / *" wird auf die Namen aller Dateien in diesem Verzeichnis erweitert. Diese Shell-Funktion wird als "Globbing" bezeichnet. Das letzte Argument von mv
ist das Zielverzeichnis. Wenn Sie sehr viele Dateien haben, funktioniert dies nicht, da die Länge der Befehlszeile begrenzt ist.
Die Lösung hat jedoch das Problem, dass Punktdateien weggelassen werden - oder "versteckte" Dateien, Dateien und Verzeichnisse, deren Name mit einem "." Beginnt. Um dies zu lösen, müssen Sie Ihre Shell anweisen, beim Globbing Dotfiles einzuschließen. Verwenden Sie dazu
shopt -s dotglob
bei der Verwendung bash
(und Sie verwenden wahrscheinlich, es bash
sei denn, Sie haben die Standardeinstellung geändert). In dieser Shell funktioniert der obige Befehl auch für Punktedateien.
Im zsh
Übrigen haben Sie die Möglichkeit, dies von Fall zu Fall zu wählen. Um dies zu tun, setzen Sie
setopt extendedglob
in deinem .zshrc
. Dann können Sie verwenden
mv $PWD/*(D) $DEST
um alle Dateien einschließlich der Punktedateien zu verschieben. (Das "D" bewirkt, dass die Option "GLOB_DOTS" vorübergehend aktiviert wird.)
Die ursprüngliche Frage war nun, alle regulären Dateien (nicht Verzeichnisse) aus allen Unterverzeichnissen und ihren Unterverzeichnissen in ein einziges Verzeichnis zu verschieben. Dies kann erreicht werden mit zsh
:
mv $PWD/**/*(D.)
Hier lässt der Ausdruck **/*
den Globber rekursiv in Unterverzeichnisse absteigen. Das D
bedeutet "auch Punktdateien auswählen"; das .
Mittel "nur reguläre Dateien auswählen, keine Verzeichnisse".