LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   mass renaming script (http://www.linuxquestions.org/questions/programming-9/mass-renaming-script-604569/)

frieza 12-04-2007 09:25 PM

mass renaming script
 
can anyone help me with either a simple shell script, c, or c++ program to take files from a digital camera labeled (IMGXXXX.JPG) and reverse the order of how they are numbered?

chrism01 12-04-2007 10:49 PM

Well, one way is to create a list of your files in order eg
ls -1 |sort >sort.dat
then a list in reverse
ls -1|sort -r>rsort.dat
then a script eg in shell to open each file and read through both files, renaming fileN in sort.dat to fileN in rsort.dat.

ghostdog74 12-05-2007 02:51 AM

Code:

ls IMG*.jpg | awk '
{
  files[++c] = $0
}
{ d=c }
END {
  for (i=1;i<=c;i++) {
    revfile = files[d--]
    if ( revfile == files[i] ) exit
    # this part do the swapping
    cmdtemp = "cp " files[i] " temp "   
    mvcmd = "mv " revfile " "files[i]
    mvback = "mv temp " revfile
    system(cmdtemp)
    system(mvcmd)
    system(mvback)
  }
}'


bigearsbilly 12-05-2007 04:16 AM

perl?

notice, this only prints the command, doesn't execute it.
do it like this...
perl_script.pl > output

then you can review if it's what you want and then simply go...
sh output
to execute.

I use this technique a lot, as:
1. you can check it first.
2. you have a record of what has been done.

Code:

#!/usr/bin/perl

@ARGV = <IMG*>;

$count = "0000" . ""; # force to string, so we don't lose the zeroes
foreach $_ (reverse @ARGV) {

    $file = $_;
    $count++;
    $file =~ s/\d.*//g;  # remove from digits to the end

    print "mv $_ ",  $file . $count . ".jpg\n";
}



4265686f6c64212074686520476e6f6d652065617465720a

radoulov 12-05-2007 04:17 AM

Code:

bash <(paste <(printf "cp %s\n" IMG*.JPG|sort -nk4,7) <(printf "_%s\n" $(ls IMG*.JPG|sort -rnk4,7)))
for f in _IMG*.JPG;do mv "$f" "${f#_}";done


jschiwal 12-05-2007 04:23 AM

Code:

files=(IMG*)
for (( n=0; n<${#files[@]}; n++ )); do
    mv ${files[n]} ${files[${#files[@]}-$n-1]}.tmp;
done
rename .tmp '' *.tmp

files=(IMG*) puts the filenames in an array. The size of the array is ${#files[@]}. The last index is ${#files[@]} -1 because the array starts with 0.

radoulov 12-05-2007 05:09 AM

With zsh:

Code:

set -- IMG<->.JPG(On)                                     
max=${1//[^0-9]}                                         
autoload -U zmv
zmv -fQ 'IMG(<->).JPG(n)' '_IMG${(l:4::0:)$((max--))}.JPG'
zmv '_IMG(*).JPG' 'IMG$1.JPG'


radoulov 12-05-2007 05:26 AM

Quote:

Originally Posted by jschiwal (Post 2980777)
Code:

files=(IMG*)
for (( n=0; n<${#files[@]}; n++ )); do
    mv ${files[n]} ${files[${#files[@]}-$n-1]}.tmp;
done
rename .tmp '' *.tmp

files=(IMG*) puts the filenames in an array. The size of the array is ${#files[@]}. The last index is ${#files[@]} -1 because the array starts with 0.

Right,
given the filename format
the sort is superfluous :)

bigearsbilly 12-05-2007 07:11 AM

i think we all agree,

mine is the best solution ;)

ghostdog74 12-05-2007 07:30 AM

Quote:

Originally Posted by bigearsbilly (Post 2980887)
i think we all agree,

mine is the best solution ;)

might be, might be not :). The "best solution" ( note: double quotes ) is what the OP choose to be, to him. Not to us.

PAix 12-05-2007 08:14 AM

Yes, neat . . . and said with such confidence too.

You just know that hex string will bug me until I've found the perl to translate it don't you! Hopefully others too.

bigearsbilly 12-05-2007 09:41 AM

ho ho!
you started it,

here's a clue


hex_read.pl
Code:

#!/usr/bin/perl -n

tr/0-9a-fA-F//cd;
print pack "H*" , $_;

hex_write.pl
Code:

#!/usr/perl -ns
BEGIN {
    warn "-chomp to ignore new line characters\n" unless $chomp;
    warn "-neat for nice easier spacing\
 (hint: finish off with 'fmt' command)\n" unless $neat;
 warn "\n";

}
chomp if $chomp;
@L =  unpack("H2" x length($_), $_) ;
print $neat? "@L\n":@L;

binary_read.pl
Code:

#!/bin/perl -n

tr/01//cd;
print pack "B*" , $_;

binary_write.pl
Code:

#!/usr/bin/perl -ns
BEGIN {
    warn "-chomp to ignore new line characters\n" unless $chomp;
    warn "-neat for nice easier spacing\
 (hint: finish off with 'fmt' command)\n" unless $neat;
}
chomp if $chomp;
@L = unpack "B8" x length($_), $_ ;

print $neat? "@L\n":@L;


PAix 12-05-2007 11:27 AM

4b65657020656174696e672074686520666f6f640a666f72204920616d206265686f6c64656e2e0a0a

536c6f7720616e64207374656164792c20746f646179206973205065726c2064617920312e0a

More than enough Perl features in your scripts to get me started. Time to dig out my books and use the resources around me. Thanks. :)

frieza 12-05-2007 03:00 PM

thx.. i used the first one, tho i havnt tried to see how the other ones work, ;)

chrism01 12-05-2007 04:46 PM

Hey BB, I'm not sure
@ARGV = <IMG*>;
guarantees the list will be in order... Also, you need a separate output dir, otherwise when file eg A1 moves to eg A4, you've lost A4 before you can move it to A1 (assume basic list is A1, A2, A3, A4 etc)


All times are GMT -5. The time now is 06:46 PM.