Home » Questions » Computers [ Ask a new question ]

How to move all files from current directory to upper directory?

How to move all files from current directory to upper directory?

How to move all files from current directory to upper directory in linux?

Asked by: Guest | Views: 306
Total answers/comments: 5
bert [Entry]

"The command you are looking for is

mv * .[^.]* ..

or (see below for more info):

(shopt -s dotglob; mv -- * ..)

Explanation: the mv command moves files and directories. The last argument to mv is the target (in this case the directory one step ""up"" in the tree, ..). The arguments before that are the source files and directories. The asterisk (*) is a wildcard which matches all files which do not start with a dot. Files that start with a dot (dotfiles) are ""hidden"". They are matched using the pattern .[^.]* (see edit below).

See the manpage which I linked for more information on mv.

Why .[^.]* instead of .* ?

As Chris Johnsen correctly points out: the pattern .* also matches . and ... Since you don't want to (and cannot) move those, it's better to use a pattern which matches any filename starting with a dot except those two. The pattern .[^.]* does just that: it matches any filename (1) starting with a dot (2) followed by a character which is not a dot (3) followed by zero or more arbitrary characters.

As Paggas points out, we'd also have to add the pattern .??* in order to match files starting with two dots. See his answer for an alternative solution using find.

Arjan's answer mentions shopt in order to avoid all those issues with dotfiles. But then there is still the problem with files starting with a dash. And it requires three commands. Still, I like the idea. I propose to use it like this:

(shopt -s dotglob; mv -- * ..)

This executes shopt in a subshell (thus no second call to shopt required) and uses -- so that files starting with a dash will not be interpreted as arguments to mv."
bert [Entry]

"Just for the sake of completeness, one can also tell the Bash shell to include hidden files, using shopt:

shopt -s dotglob
mv -- * ..
shopt -u dotglob"
bert [Entry]

Ultimately trying mv . will fail because mv won't be able to unlink the directory that you are currently in. You could mv * .. to move the files in the cwd.
Ultimately trying mv . will fail because mv won't be able to unlink the directory that you are currently in. You could mv * .. to move the files in the cwd.
bert [Entry]

"mv * .??* ../.

* gets all not-dot files. .??* gets all . files at least three bytes long, which works for all legit ones. Anything left you probably want to rm rather than mv anyway.

The ../. doesn't offer any direct benefits over .. but when doing a move-to-directory it is a very good habit to get into, because it will fail, as you want, if there is something wrong with the path. For example, mv xyz bletch, where you think bletch is a directory, can be made more certain with mv xyz bletch/.."
bert [Entry]

"This minimized command works on most modern shells:

\mv -- {,.{[^.],??}}* ..

Otherwise mentioned is a portable solution:

\mv -- * .[^.] .??* ..

Features:

\ prevents aliases from altering mv undesirably.
-- prevents filenames containing leading hyphens (-xyz) from being interpreted as command-line arguments.
.[^.] matches all two character filenames beginning with . except ..
.??* matches all other filenames three characters or longer.

Naive Implementations:

The following skips hidden UNIX filenames, those that begin with . (.bashrc).

mv * ..

The following matches .. which recursively attempts to move every directory eventually all the way back to / into .. of the current working directory ($PWD or pwd). Never use.

mv .* .."