If I run the command mv folder2/*.* folder
, I get "argument list too long" error.
I find some example of ls
and rm
, dealing with this error, using find folder2 -name "*.*"
. But I have trouble applying them to mv
.
If I run the command mv folder2/*.* folder
, I get "argument list too long" error.
I find some example of ls
and rm
, dealing with this error, using find folder2 -name "*.*"
. But I have trouble applying them to mv
.
find folder2 -name '*.*' -exec mv {} folder \;
-exec
runs any command, {}
inserts the filename found, \;
marks the end of the exec command.
The other find
answers work, but are horribly slow for a large number of files, since they execute one command for each file. A much more efficient approach is either to use +
at the end of find
, or use xargs
:
# Using find ... -exec +
find folder2 -name '*.*' -exec mv --target-directory=folder '{}' +
# Using xargs
find folder2 -name '*.*' | xargs mv --target-directory=folder
find folder2 -name '*.*' -exec mv \{\} /dest/directory/ \;
First, thanks to Karl's answer. I have only minor correction to this.
My scenario:
Millions of folders inside /source/directory, containing subfolders and files inside. Goal is to copy it keeping the same directory structure.
To do that I use such command:
find /source/directory -mindepth 1 -maxdepth 1 -name '*' -exec mv {} /target/directory \;
Here:
Commands suggested in answers above made result directory structure flat - and it was not what I looked for, so decided to share my approach.
This one-liner command should work for you. Yes, it is quite slow, but works even with millions of files.
for i in /folder1/*; do mv "$i" /folder2; done
It will move all the files from folder /folder1
to /folder2
.
find doesn't work with really long lists of files, it will give you the same error "Argument list too long". Using a combination of ls, grep and xargs worked for me:
$ ls|grep RadF|xargs mv -t ../fd/
It did the trick moving about 50,000 files where mv and find alone failed.