How do I move files and not directories into another folder/parent folder?
I have a folder structure that is extremely ugly, with some .mp3 files buried 6 levels deep in a sub-folder.
I want to end up with all of the files (mostly .mp3 but not all) in one directory, with no subdirectories at all, using Ubuntu.
Help?
5 Answers 5
There is a great answer in the askubuntu-QA.
To do so, Open a terminal and execute this command:
mv -v ~/Downloads/* ~/Videos/It will move all the files and folders from Downloads folder to Videos folder.
To Move all files, but not folders:
But, If you are interested to move all files (but not folders) from Downloads folder to Videos folder, use this command
find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/VideosTo move only files from the Download folders, but not from sub-folders:
If you want to move all files from the Downloads folder, but not any files within folders in the Download folder, use this command:
find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videoshere,
-maxdepthoption specifies how deep find should try,1means, only the directory specified in the find command. You can try using2,3also to test.See the Ubuntu find manpage for a detailed explanation.
-
2If what I want to do is copy all files to the folder will I just have to change mv to cp? I am new to linuxNeoryder– Neoryder2016年05月25日 10:30:46 +00:00Commented May 25, 2016 at 10:30
Solution
find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +
The command will find all regular files under /src/dir (including all subdirectories) and move them to the /dst/dir by use of the command mv. Just replace the directories by yours. Files with the same names will be renamed automatically.
Selecting files to move
If you want to move just MP3 files, add -iname "*.mp3" option to the find command after -type f.
Comparison to the reply by c0dev
Only the second command in the c0dev's reply answers the question. Below is how does it compare to this reply. The points 3. and 4. can be resolved in the other reply the same way as here.
- Except
mvthe solution with-exec +does not need to call an additional command likexargsorparalleland hand over the file names twice. - The other reply will silently overwrite files which have the same name. Here the files will be automatically renamed thanks to the option
--backup=numbered. Unfortunately these backups with suffix like~3~will be hidden in most of the file manages by default. Unfortunatelymvdoes not allow changing of the suffix but it could be easily post-processed by additional commands. This is a GNU extension. - Contrary to
-print0-exec command {} +is a part of IEEE Std 1003.1 (POSIX), ISO/IEC 9945 and The Single UNIX Specification standards. Thus it should be more portable. See IEEE Std 1003.1, 2004 Edition, IEEE Std 1003.1, 2013 Edition and 0000243: Add -print0 to "find". But anyway the required-tswitch ofmvis a GNU extension so the whole command is not portable between POSIX systems.
Note: In the case find would be able to produce paths starting with - (I do not know of any such implementation of find at the moment.) the {} should be preceded by the end-of-options indicator: --.
-
Error: find: missing argument to `-exec'Chris– Chris2013年10月12日 23:05:49 +00:00Commented Oct 12, 2013 at 23:05
-
@Chris: You are right, it seems that
{}must be as the last argument. Corrected.pabouk - Ukraine stay strong– pabouk - Ukraine stay strong2013年10月12日 23:27:08 +00:00Commented Oct 12, 2013 at 23:27 -
1Neither
xargsnor-exec +have issues with file names starting with-— just try it out with e.g.echoand see. Regarding portability, the-tswitch tomvis a GNU extension anyway, and if the user has GNUmv, it most likely has GNUfindandxargs(at least vice versa would be equally probable, so there would be no net gain in portability). I agree with the conclusion that-exec +usually is a more straightforward solution than-print0 | xargs -0, though.Daniel Andersson– Daniel Andersson2014年08月02日 07:16:58 +00:00Commented Aug 2, 2014 at 7:16 -
1@pabouk: I meant to try it with
findin combination with-exec echo {} +or-print0 | xargs -0 echo, but I was unclear.findwill never deliver file name arguments in a form that can be misinterpreted as switches, sincefindwill always prepend the file names with the path. In the case of files in the base directory, it will prepend./, so the--protection does not actually do anything here.Daniel Andersson– Daniel Andersson2014年08月03日 12:31:37 +00:00Commented Aug 3, 2014 at 12:31 -
1This solution also handles cases where no files are found. The one from @Christian errors out (might be what you want)Moritz– Moritz2024年06月04日 10:20:44 +00:00Commented Jun 4, 2024 at 10:20
Open terminal, cd to your folder of folders with files and run find . -mindepth 2 -type f -print -exec mv {} . \;
to move all files from these sub-directories into the current one.
-
It overwrites files with the same names.Aliaksandr Adzinets– Aliaksandr Adzinets2024年03月21日 20:03:01 +00:00Commented Mar 21, 2024 at 20:03
My one-liner - this works on Macs but should also do on any *nix. Start from the directory where you want to remove the subfolders.
# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf
The first part moves everything from all subfolders to the actual folder from where you staret the command; the second part checks if subdirs are empty (they should now :-) and deletes them so you get everything here with no subdirs.
-
(1) Please explain what your answer does, and any advantages it has over the other answers (which are very similar). Please do not respond in comments; edit your answer to make it clearer and more complete. (2) Note that the
-notoperator is non-standard, so your command is less portable than the others.Scott - Слава Україні– Scott - Слава Україні2018年10月07日 10:31:45 +00:00Commented Oct 7, 2018 at 10:31 -
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf I ran this command in a folder and it deleted the sub folders, the folder I was in, and then moved up to the parent folder. Luckily I was watching my file manager and managed to stop the command and it was run in a test folder.Will– Will2019年11月04日 00:57:24 +00:00Commented Nov 4, 2019 at 0:57
-
Hm, I use this frequently (on Macs) and it never deleted the actual folder I'm in - it only deleted the subfolders from here. Can't reproduce your problem, sorry...X-File– X-File2020年01月22日 12:56:30 +00:00Commented Jan 22, 2020 at 12:56
-
Problem is that it overwrites duplicate file namesMobileMon– MobileMon2020年07月02日 20:40:40 +00:00Commented Jul 2, 2020 at 20:40
Unfortunately, I do not have a high enough reputation to comment on the marked solution. However, I wanted to caution others about an issue I ran into. It's quite amateur; however, when you're doing several things it may not come to mind at first. Hopefully, it will help others.
Problem
Variations of the following message was provided after initiating the command. The command then creates multiple files.
mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file
Cause
The /src is a parent of the /dst (e.g. /src/../dst/).
Solution
While there may be a better solution, I simply moved the files to a temporary directory outside of my /src and then reran the command to place them back within the /src/../dst directory I wanted them to end up in.
You must log in to answer this question.
Explore related questions
See similar questions with these tags.