How do you move all files (including hidden) from one directory to another?
Zsh
mv Foo/*(DN) Bar/
or
setopt -s glob_dots
mv Foo/*(N) Bar/
(Leave out the (N)
if you know the directory is not empty.)
Bash
shopt -s dotglob nullglob
mv Foo/* Bar/
Ksh93
If you know the directory is not empty:
FIGNORE='.?(.)'
mv Foo/* Bar/
Standard (POSIX) sh
for x in Foo/* Foo/.[!.]* Foo/..?*; do
if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done
If you're willing to let the mv
command return an error status even though it succeeded, it's a lot simpler:
mv Foo/* Foo/.[!.]* Foo/..?* Bar/
GNU find and GNU mv
find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +
Standard find
If you don't mind changing to the source directory:
cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "$@" "$0"' ../Bar/ {} + -type d -prune
Here's more detail about controlling whether dot files are matched in bash, ksh93 and zsh.
Bash
Set the dotglob
option.
$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero
There's also the more flexible GLOBIGNORE
variable, which you can set to a colon-separated list of wildcard patterns to ignore. If unset (the default setting), the shell behaves as if the value was empty if dotglob
is set, and as if the value was .*
if the option is unset. See Filename Expansion in the manual. The pervasive directories .
and ..
are always omitted, unless the .
is matched explicitly by the pattern.
$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one
Ksh93
Set the FIGNORE
variable. If unset (the default setting), the shell behaves as if the value was .*
. To ignore .
and ..
, they must be matched explicitly (the manual in ksh 93s+ 2008-01-31 states that .
and ..
are always ignored, but this does not correctly describe the actual behavior).
$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero
You can include dot files in a pattern by matching them explicitly.
$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero
To have the expansion come out empty if the directory is empty, use the N
pattern matching option: ~(N)@(*|.[^.]*|..?*)
or ~(N:*|.[^.]*|..?*)
.
Zsh
Set the dot_glob
option.
% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero
.
and ..
are never matched, even if the pattern matches the leading .
explicitly.
% echo .*
..two .one
You can include dot files in a specific pattern with the D
glob qualifier.
% echo *(D)
..two .one none zero
Add the N
glob qualifier to make the expansion come out empty in an empty directory: *(DN)
.
Note: you may get filename expansion results in different orders
(e.g., none
followed by .one
followed by ..two
)
based on your settings of the LC_COLLATE
, LC_ALL
, and LANG
variables.
#!/bin/bash
shopt -s dotglob
mv Foo/* Bar/
From man bash
dotglob If set, bash includes filenames beginning with a '.' in the results of pathname expansion.
A simple way to do this in bash
is
mv {Foo/*,Foo/.*} Bar/
But this will also move directories.
If you want to move all files including hidden but don't want to move any directory you can use a for loop and test.
for i in $(ls -d {Foo/*,Foo/.*});do test -f $i && mv -v $i Bar/; done;