Move all files from subdirectories to current directory?
Solution 1:
You can also use the -mindepth
option:
find . -type f -mindepth 2 -exec mv -i -- {} . \;
(Together with -maxdepth
you could also limit the hierarchy levels from which to collect the files.)
I used mv -i
(“interactive”) to make mv
ask before overwriting files. With a lot of subdirectories, there may be name clashes you'd like to be warned about.
The --
option stops option processing, so mv
doesn't get confused by filenames starting with a hyphen.
Clean up the whole bunch of empty subdirectories with
find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Solution 2:
Try this:
find ./*/* -type f -print0 | xargs -0 -J % mv % .
More Info: Try the find-stamement alone, it should give you a list with all the files you want to move (leave out the -print0
). Example:
probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7
with -print0
and xargs
you are now creating a list of statements to be executed. The -J %
flag means, insert the list element here, so mv $FILE .
is executed for every file found.
The above is working for the BSD xargs. If you're using the GNU-version (Linux) take -I %
instead of -J %
Solution 3:
mv */* .
It will move all files from all subdirectories to current directory.
If you need some cleanup, you could use
find . -type d -empty -delete
It will delete all empty subdirectories.