Come faccio a spostare tutti i file in una directory (compresi quelli nascosti) in un'altra directory?
Ad esempio, se ho una cartella "Foo" con i file ".hidden" e "notHidden" all'interno, come faccio a spostare entrambi i file in una directory denominata "Bar"? Quanto segue non funziona, poiché il file ".hidden" rimane in "Foo".
mv Foo/* Bar/
Provalo tu stesso.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
Risposta accettata:
Zsh
mv Foo/*(DN) Bar/
o
setopt -s glob_dots
mv Foo/*(N) Bar/
(Tralascia il (N)
se sai che la directory non è vuota.)
Bash
shopt -s dotglob nullglob
mv Foo/* Bar/
Ksh93
Se sai che la directory non è vuota:
FIGNORE='.?(.)'
mv Foo/* Bar/
Standard (POSIX) sh
for x in Foo/* Foo/.[!.]* Foo/..?*; do
if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done
Se sei disposto a lasciare che mv
comando restituisce uno stato di errore anche se è riuscito, è molto più semplice:
mv Foo/* Foo/.[!.]* Foo/..?* Bar/
GNU trova e GNU mv
find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +
Ricerca standard
Se non ti dispiace passare alla directory di origine:
cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "[email protected]" "$0"' ../Bar/ {} + -type d -prune
Ecco maggiori dettagli sul controllo della corrispondenza dei file dot in bash, ksh93 e zsh.
Bash
Imposta il dotglob
opzione.
$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero
C'è anche il più flessibile GLOBIGNORE
variabile, che puoi impostare su un elenco separato da due punti di modelli di caratteri jolly da ignorare. Se non impostato (l'impostazione predefinita), la shell si comporta come se il valore fosse vuoto se dotglob
è impostato e come se il valore fosse .*
se l'opzione non è impostata. Vedere Espansione del nome file nel manuale. Le directory pervasive .
e ..
sono sempre omessi, a meno che il .
corrisponde esplicitamente al modello.
$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one
Ksh93
Imposta il FIGNORE
variabile. Se non è impostato (l'impostazione predefinita), la shell si comporta come se il valore fosse .*
. Per ignorare .
e ..
, devono essere abbinati esplicitamente (il manuale in ksh 93s+ 2008-01-31 afferma che .
e ..
vengono sempre ignorati, ma questo non descrive correttamente il comportamento effettivo).
$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero
Puoi includere file di punti in uno schema abbinandoli esplicitamente.
$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero
Per fare in modo che l'espansione esca vuota se la directory è vuota, utilizzare il N
opzione di corrispondenza del modello:~(N)@(*|.[^.]*|..?*)
o ~(N:*|.[^.]*|..?*)
.
Zsh
Imposta il dot_glob
opzione.
% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero
.
e ..
non vengono mai abbinati, anche se il modello corrisponde al .
esplicitamente.
% echo .*
..two .one
Puoi includere file di punti in uno schema specifico con la D
qualificatore globale.
% echo *(D)
..two .one none zero
Aggiungi il N
qualificatore glob per far uscire l'espansione vuota in una directory vuota:*(DN)
.
Nota:potresti ottenere risultati di espansione del nome file in ordini diversi
(ad es. none
seguito da .one
seguito da ..two
)
in base alle tue impostazioni di LC_COLLATE
, LC_ALL
e LANG
variabili.