I needed to copy files generated by doxygen from one directory into another for a large opensource C++ project. Sadly there were too many files in the directory, so bash started complaining 🙁 cp and rsync died out with the error of argument list too long. initially I figured I could generate it all from scratch in new location but it was quicker and easier to use a for loop to rsync the files over 🙂
some info:
- all files start with alphabetic characters.
- there are no spaces in the names
- all files are in single directory
I realized bash expansion would work here.
Using for loop
for x in {a..b} do echo $x* done
Notice I only stepped between A and B because I didn’t want to sit there for an hour while it listed all the files. this worked well, it listed all files and I was sure it would suite my purposes. now the real deal!
for x in {a..z} do echo $x rsync -az /backups/doxygen/$x* /home/user/current/directory/ done
sometimes you might still get the error even for each letter, for example I still had too many files starting with D and Q. so I just changed where I globbed :
for x in {a..z} do echo $x rsync -az /backups/doxygen/d$x* /home/user/current/directory/ done
this allows me to further iterate a thru z but after starting the files with the letter d. Now what happens if you happen to have files starting with numbers? simply switch the letters for numbers.
for x in {0..9} do echo $x rsync -az /backups/doxygen/$x* /home/user/current/directory/ done
You can use any other command you need in place of rsync. like mv cp mkdir or any custom commands.
for x in {a..z} do echo $x mv /backups/doxygen/$x* /home/user/current/directory/ done
Globbing
Now if you don’t want to use for loops you can glob them in a one liner like so :
ls /backups/doxygen/[x-z]*
and the actual command using cp and globbing
cp -r /backups/doxygen/[a-z]* /home/user/current/directory/
and again going a level deeper
cp -r /backups/doxygen/d[a-z]* /home/user/current/directory/
Voila! argument list too long is now vanquished! do any of you have a better way of dealing with this? let me know!
More info about globbing.