So I’m quite new with bash
and Stack Overflow in general, so forgive me if I may be missing something.
I’ve been trying to create a script that moves a certain amount of files (ex: 3 files), that may contain spaces (like "hello world.txt"
), to another directory.
I’ve tried a few different ways to get the files with spaces, but have all proven a little difficult and finally narrowed it down to just using *.csv
. For instance the code will look like (simplified):
for file in *.csv; #grab 3 files do echo "$file"; mv "$file" "$TDIR" done
I only want to move a certain amount of files, like 3. $TDIR
in this case is a target directory to move them to.
I’ve done it this way because I’m able to grab the whole filename "Hello World.txt"
instead of grabbing "Hello"
and "World.txt"
.
I’ve tried using different things like:
ls -p | grep -v / | head -3
but it gives me the above result where it creates 2 files (the spaces causing problems).
Sorry it’s kind of long but I’ve been struggling with this and would greatly appreciate any help.
Advertisement
Answer
The minimum necessary change is to use the loop you have, but simply break out early:
((count = 3)) for file in *.csv ; do echo "$file" mv "$file" "$TDIR" ((count--)) [[ ${count} -eq 0 ]] && break; done
The only real potential downside of this solution is that it may fail if you have a truly stupendous number of files, so many that the shell globbing starts to struggle under the load. However, I find it’s often easier than trying to remember or research the ninety-two find
parameters that will enable the same behaviour 🙂