In Linux (Ubuntu), how do you move all the files and directories to the parent directory?
-
2the question with by far the most complete answer i found: unix.stackexchange.com/q/6393/93768DJCrashdummy– DJCrashdummy2018年09月06日 18:39:32 +00:00Commented Sep 6, 2018 at 18:39
16 Answers 16
find . -maxdepth 1 -exec mv {} .. \;
this will move hidden files as well.
You will get the message:
mv: cannot move `.' to `../.': Device or resource busy
when it tries to move . (current directory) but that won't cause any harm.
-
1It will move all files from all subdirectories to the parent of the current directory, too. I'd use
-maxdepth 1to be sure.raphink– raphink2009年12月27日 17:36:40 +00:00Commented Dec 27, 2009 at 17:36 -
1Now it says: mv: cannot move
./scripts' to../scripts': Directory not emptynekbaba– nekbaba2009年12月27日 17:43:29 +00:00Commented Dec 27, 2009 at 17:43 -
1You must have a directory called scripts in your parent directory AND in your current directory. You will have to rename this one before you move it.raphink– raphink2009年12月27日 17:44:49 +00:00Commented Dec 27, 2009 at 17:44
-
6It worked but you left one one very important bit of information - you must run this from the subdirectory. Also this will not delete the subdirectory itself so you must back up one directory and do a rmdir on the subdirectory.crafter– crafter2016年05月10日 16:50:54 +00:00Commented May 10, 2016 at 16:50
-
1I found this superior:
find . -mindepth 1 -maxdepth 1 -exec mv -t .. -- {} +(taken from unix.stackexchange.com/q/6393/93768). No error messages and actually working in my bash script.Adam Ryczkowski– Adam Ryczkowski2020年10月18日 09:00:59 +00:00Commented Oct 18, 2020 at 9:00
I came here because I'm new to this subject as well. For some reason the above didn't do the trick for me. What I did to move all files from a dir to its parent dir was:
cd to/the/dir
mv * ../
-
24This does not move hidden file thoughWavesailor– Wavesailor2015年09月10日 10:51:14 +00:00Commented Sep 10, 2015 at 10:51
-
1 liner:
(cd ${ANDROID_NDK_HOME}/android-ndk-r14b/ && mv * ../)Gelldur– Gelldur2017年12月07日 11:51:02 +00:00Commented Dec 7, 2017 at 11:51 -
-
This will break on large file sets due to command line limitationsBasilevs– Basilevs2025年11月02日 20:17:45 +00:00Commented Nov 2 at 20:17
It can't be more simple than:
mv * ../
To also move hidden files:
mv /path/subfolder/{.,}* /path/
mv is a command to move files, * means all files and folders and ../ is the path to the parent directory.
Type this in the shell:
mv *.* ..
That moves ALL the files one level up.
The character * is a wildcard. So *.deb will move all the .deb files, and Zeitgeist.* will move Zeitgeist.avi and Zeitgeist.srt one folder up, since, of course, .. indicates the parent directory.
To move everything including folders, etc, just use * instead of *.*
-
4this didn't work with the dirs! or the hidden filesnekbaba– nekbaba2009年12月27日 17:34:44 +00:00Commented Dec 27, 2009 at 17:34
-
It works with dirs, at least for me.maaartinus– maaartinus2011年01月25日 21:21:46 +00:00Commented Jan 25, 2011 at 21:21
-
7You want
*not*.*to include directoriesChris S– Chris S2013年04月19日 19:58:41 +00:00Commented Apr 19, 2013 at 19:58 -
1Its a nice documentaryBlackBurn027– BlackBurn0272016年11月17日 06:36:27 +00:00Commented Nov 17, 2016 at 6:36
-
zsh: argument list too long: mv;bash: /usr/bin/mv: Argument list too long. Aparently it doesn't work for 80k filesMartin Thoma– Martin Thoma2022年01月27日 18:04:02 +00:00Commented Jan 27, 2022 at 18:04
There is no need to change directories. Just include * at the end of path:
mv /my/folder/child/* /my/folder/
Above only moves non hidden files. To move only hidden files use .*
mv /my/folder/child/.* /my/folder/
Above two can be combined in to one command:
mv /my/folder/child/{.,}* /my/folder/
Also see: How to move all files including hidden files into parent directory via *
Assuming all your hidden files begin with dot followed by a letter or a number (which they should), you could use
mv * .[A-Za-z0-9]* ..
The .[A-Za-z0-9]* part is to make sure you don't try to move . or .. along, which would fail.
In bash you can use shopt -s dotglob to make * match all files and move them simply by
shopt -s dotglob; mv * ..
This is not the best solution since the setting is permanent for the shell until you change it by
shopt -u dotglob
but I think it's good to know.
-
4Call it in a subshell:
(shopt -s dotglob && mv * ..). That way, the option is only local to that subshell.Martin Ueding– Martin Ueding2013年01月26日 20:25:57 +00:00Commented Jan 26, 2013 at 20:25 -
Good answer - it's simple, includes hidden files and doesn't cause an error about copying '.' and '..'Daniel Howard– Daniel Howard2017年11月09日 13:06:36 +00:00Commented Nov 9, 2017 at 13:06
As outlined by others, mv * ../ is the most straight forward way to copy all files from a sub directory to its parent directory.
However, if the list of files to copy is very large, you may run into this error:
-bash: /bin/mv: Argument list too long (see this article for more info).
Then you can use the other suggestion:
find . -mindepth 1 -maxdepth 1 -exec mv {} .. \;
Note the addition of -mindepth 1. Then the warning "mv: cannot move .' to ../.': Device or resource busy" does not appear because the current directory is not included.
Note: you have to execute these commands from the sub directory.
A method which causes no errors and works every time:
ls -1A . | while read -r file
do
mv "./${file}" ..
done
find . -maxdepth 2 -type f -exec mv {} .. \;
I used a variation of above to move all the files from subfolders into the parent.
I'd got data in folders by year, but found by using metadata I could have them all in the same folder which made it easier to manage.
eg.
/data/2001/file_1
/data/2002/file_2
/data/2003/file_3
It's simple to move all files and folders to the parent directory in Linux.
Go to that folder and use this command:
mv * /the full path
For example, if your files and folders are as follows:
/home/abcuser/test/1.txt
2.txt
3.jpg
4.php
1folder
2folder
Go to that folder via cd:
cd /home/abcuser/test
mv * /home/abcuser
All your files and folders will move to the abcuser folder (parent directory).
-
2Thanks @Gareth, was about to the same. Abhishek, please don't post any unrelated links, where's the sense in that? Also, check your formatting please. Additionally,
/the full pathdoes not work in Linux, you have to escape spaces with/the\ full\ path.slhck– slhck2011年11月03日 11:47:00 +00:00Commented Nov 3, 2011 at 11:47
find -type f|while read line; do mv $line ${line##*/}; done
-
Thanks for contributing an answer. While this might work in simple scenarios, piping
findintowhile readis a bad way to usefind, and better answers have already been posted.Scott - Слава Україні– Scott - Слава Україні2018年12月13日 16:29:29 +00:00Commented Dec 13, 2018 at 16:29
There's a lot of answers to this question, which proves the flexibility of Bash commands. However, to me a very simply solution that does the trick nicely is this one:
mv * .[^.]* .??* ..
mv move; * select all files and folders; .[^.]* collects up the hidden files, with one dot at the start of their name; .??* will select files that start with two dots followed by other characters; .. is the destination, which in this case is the parent folder.
Note, using .[^.]* and .??* will ensure you only select those files with a single dot followed by something other than a dot, and those with two dots followed by other characters.
If you'd like to avoid trying to remember this, I suggest setting up an alias, such as, alias mvallup="mv * .[^.]* .??* ..". Add this to ~/.bash_aliases. Now you can just type mvallup and it's a done deal.
A shorter version of this was suggested by William Edwards, but it didn't include hidden files. He gave an example for also moving hidden files, but that was not exampled as simply as it could have been (mv /path/subfolder/{.,}* /path/) hence why I'm posting this very simple option.
One liner to combine find and mv
Find folder in which we are interested see find
For each such folder we execute:
echo "Moving $found_folder" # Just print
(cd "$found_folder" && mv * ../); # enter dir AND move content to parent
rmdir "$found_folder" # remove dir, this will be done only when dir is empty so nice check is everything fine
for found_folder in $(find . -type d -wholename '*/config/my_catchy_name'); do echo "Moving $found_folder"; (cd "$found_folder" && mv * ../); rmdir "$found_folder"; done;
- Moves sub dirs (when destination doesn't have already such dirs)
- Moves hidden files
- Moves symbolic links without making mess
Simple and memorisable:
mv ./{.,}* ..
switch to sub directory and execute following command for copy or move files.
ex: a is parent directory and b is sub directory, we want to move/copy all files from b to a (sub directory to parent directory).
cd b
cp * ..
mv * ..
-
Welcome to Super User! This duplicates another answer and adds no new content. Please don't post an answer unless you actually have something new to contribute.2016年05月20日 10:46:32 +00:00Commented May 20, 2016 at 10:46