18

I have this huge folder with thousands of unordered files. Is it feasible to move the first 5000s to a subfolder via the mv command? For now I move files with

 mv *some_pattern* ./subfolder1/

As for now, I move images quite randomly, it's not really important if there aren't exactly 5000 files in each subfolder. Is there a better way to do it?

15
mv `ls | head -500` ./subfolder1/
  • 11
    (assuming none of the filenames contain space, tab, newline, star, open square bracket, question mark characters or start with - or . and assuming subfolder1 itself does not show up in that list.) – Stéphane Chazelas Dec 13 '13 at 17:05
  • @StéphaneChazelas if the file contains those, how do we modify the command? – Peiti Li Nov 10 '17 at 23:19
14

With zsh:

mv -- *(D.oN[1,5000]) ./subfolder1

To move up to 5000 regular files in the order they are in the directory.

For the first 5000 in the lexicographically sorted list:

mv -- *(D.[1,5000]) ./subfolder1

If you get an error about arg list too long. You can use zsh's buitin mv command by issuing:

zmodload zsh/files

first.

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/
  • 2
    The POSIX snippet is a gem – iruvar Dec 13 '13 at 18:55
5

A version that is simple and supports special chars, spaces, etc.

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

For this to work as-is dir2 must exist and you have to execute it from the parent directory of dir1 and dir2.

This will move 1000 files from dir1 to dir2.

  • nice one! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/ for moving 1000 largest files in dir1 (-S lists file by size) – oneklc May 3 '18 at 23:05
  • 1
    Note that ls -Q does not produce an output compatible with xargs's expected input format. It helps for file names containing space characters, but not for double quotes or backslashes and harms for file names containing control characters including TAB. – Stéphane Chazelas Jun 29 '18 at 13:17
3

You might need to do something like this:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

This script works in bash, ksh, sh and multiple UNIX variants.

  • 1
    (provided none of the filenames contain space, tab, newline, star, open square bracket, question mark characters or start with - or . and provided destination itself does not show up in that list.) – Stéphane Chazelas Dec 13 '13 at 17:25
  • @StephaneChazelas True. This is not a complete solution just a method of dealing with the problem. – Karlson Dec 13 '13 at 17:39
0
  1. Goto the directory which you want to move files from
  2. run below command

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 
    

In the find command, . (dot) denotes current directory

finds files which start with Hello and end with gz , first 5000 files will be moved to the path /data01/path/

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.