Au lieu d'utiliser find
(qui fait bien le travail), vous pouvez également utiliser le shell à cette fin.
Disons que vous voulez tous les fichiers de $ PWD à $ DEST. La tentative naturelle serait:
mv $PWD/* $DEST
Comment cela marche-t-il? L'expression "$ PWD / *" s'étend aux noms de tous les fichiers de ce répertoire. Cette fonction shell est appelée "globbing". Le dernier argument de mv
est le répertoire de destination. Si vous avez de très nombreux fichiers, cela ne fonctionnera pas car la longueur de la ligne de commande est limitée.
Mais la solution a le problème d'omettre les fichiers de points - ou les fichiers, fichiers et répertoires "cachés" dont le nom commence par un ".". Pour résoudre ce problème, vous devez dire à votre shell d'inclure des fichiers dot lors de la globalisation. Pour ce faire, utilisez
shopt -s dotglob
lors de l'utilisation bash
(et vous l'utilisez probablement, bash
sauf si vous avez modifié la valeur par défaut). Dans ce shell, la commande ci-dessus fonctionnera également pour les fichiers dot.
En passant, dans zsh
, vous avez la possibilité de le choisir au cas par cas. Pour ce faire, mettez
setopt extendedglob
dans votre .zshrc
. Ensuite, vous pouvez utiliser
mv $PWD/*(D) $DEST
pour déplacer tous les fichiers, y compris les fichiers dot. (Le "D" a pour effet d'activer temporairement l'option "GLOB_DOTS").
Maintenant, la question d'origine était de déplacer tous les fichiers normaux (pas les répertoires) de tous les sous-répertoires et leurs sous-répertoires vers un seul répertoire. Cela peut être accompli avec zsh
:
mv $PWD/**/*(D.)
Ici, l'expression **/*
fait descendre le globber récursivement dans des sous-répertoires. Le D
moyen "sélectionne également les fichiers dot", le .
moyen "ne sélectionne que les fichiers normaux, pas les répertoires".