Invece di usare find
(il che fa bene il lavoro), puoi anche usare la shell a tal fine.
Supponiamo che tu voglia tutti i file da $ PWD a $ DEST. Il tentativo naturale sarebbe:
mv $PWD/* $DEST
Come funziona? L'espressione "$ PWD / *" si espande nei nomi di tutti i file in quella directory. Questa funzione di shell si chiama "globbing". L'ultimo argomento di mv
è la directory di destinazione. Se hai molti file, questo non funzionerà perché la lunghezza della riga di comando è limitata.
Ma la soluzione ha il problema di omettere file dot - o file "nascosti", file e directory il cui nome inizia con un ".". Per risolvere questo problema, devi dire alla tua shell di includere dotfile durante il globbing. Per fare questo, usa
shopt -s dotglob
quando si utilizza bash
(e probabilmente si utilizza a bash
meno che non sia stata modificata l'impostazione predefinita). In questa shell, il comando sopra funzionerà anche per i dotfile.
A parte questo, zsh
hai la possibilità di scegliere questo caso per caso. Per fare questo, metti
setopt extendedglob
nel tuo .zshrc
. Quindi puoi usare
mv $PWD/*(D) $DEST
per spostare tutti i file, inclusi i dotfile. (La "D" ha l'effetto di abilitare temporaneamente l'opzione "GLOB_DOTS").
Ora la domanda originale era spostare tutti i file regolari (non le directory) da tutte le sottodirectory e le loro sottodirectory in una singola directory. Questo può essere realizzato con zsh
:
mv $PWD/**/*(D.)
Qui l'espressione **/*
fa scendere globalmente ricorsivamente nelle sottodirectory. Il D
mezzo "seleziona anche dotfile"; il .
mezzo "seleziona solo file regolari, non directory".