Read files inside directory and group them on new sub-directory (creating the subdir and renaming the file)

4

I've performed a recovery for old deleted files! The process was a complete success and recovered files from years ago.

Now the problem is going through all the 400000 files recovered of the type JPG alone.

To deal with this, I've already separated the files by their size and stored the ones that match the criteria on a different directory:

find /path/to/files/ -size +100k -print0 | xargs -0 cp --target-directory=/path/to/filtered/files/

Since the files are to be analyzed remotely, I've prepared a web page to show all files, allowing them to be saved locally. This web page will present the files 20 at a time with navigation arrows!


My question is how to split the 400000 files into sub-directories containing 20 files each, and have the files renamed sequentially:

Rename to

000001.jpg
000002.jpg
...
000020.jpg

Move into sub-directory, by creating the sub-directory

page_0001

Repeat until all 400000 have been processed!

page_0002/000021.jpg
page_0002/000022.jpg
...
page_0002/000040.jpg

Zuul

Posted 2012-05-24T11:52:02.043

Reputation: 3 659

… renamed sequentially based on what? Their modification time? Their alphanumerical sort order? – slhck – 2012-05-24T12:33:04.863

@slhck, no particular specification for the rename, just giving some "decent" name to the file related with later processing issues, so, basically, renamed as they are read! – Zuul – 2012-05-24T13:11:38.187

Why do you need to have them in subdirectories? – Daniel Andersson – 2012-05-25T07:30:15.603

Answers

2

I have the same problem. I write this code in BASH, and worked for me.

Change with your needs:

#/bin/bash

target_prefix=page

SOURCE_DIR=YOUR_DIR #Change this to source dir

N=0
Z=0

for entry in $SOURCE_DIR/*
do
    N=$((N+1))
    Z=$((Z+1))

    if [ "$N" == "1" ]; then
        mkdir $SOURCE_DIR/$target_prefix-$Z
        DIR="$SOURCE_DIR/$target_prefix-$Z"
    fi

    echo "Move image $entry number $N to dir $DIR"

    mv $entry $DIR/$Z.jpg #Change to your file extension

    if [ "$N" == "20" ]; then
                N=0
        fi
done

Hope this work.

Octávio Filipe Gonçalves

Posted 2012-05-24T11:52:02.043

Reputation: 638

I'll give it a try and get back to you soon! – Zuul – 2012-06-06T00:05:21.747

Tks, did the job pretty well! Didn't addressed the lending zeros issue, but I can deal with that at a later stage! Tks Again. – Zuul – 2012-06-06T09:59:05.847

0

The following Bash script should do the trick, but no guarantees.

i=1
for f in *
do
  fn=$(printf "%.6d" $i).jpg
  dn=page_$(printf "%.4d" $(($i%20)))
  mkdir -p $dn
  cp $f "$dn/$fn"
  i=$(($i+1))
done

Alex Chamberlain

Posted 2012-05-24T11:52:02.043

Reputation: 231

I'll try it out and give you some feedback! – Zuul – 2012-05-24T12:21:52.787

for f in * might not work with 400000 (!) files. That's just too many arguments to handle. Consider looping over find . -print0 results piping into while read -d '' -r file or similar. – slhck – 2012-05-24T12:26:15.560

Fixed the parentheses. I didn't try running this, as I didn't have a suitable set of files. – Alex Chamberlain – 2012-05-24T12:34:48.480

I've tried this, but it was issuing an unspecified error... Can't really tell what the error was :( – Zuul – 2012-06-06T09:56:05.960