LINUX.ORG.RU

shell-скрипт переименования файлов в цикле file100 > file99... file1 > file100


0

0

Есть 100 файлов в ~/ с именами file1.gif, file2.gif, ..., file100.gif

Нужно сместить их имена "против часовой стрелки" - тот, что file100.gif сделать file99.gif, file1.gif сделать file100.gif

Ничерта не представляю как нацарапать такой вот цикл. Понятно, что промежуточные временные файлы понадобятся и одним mv тут не обойтись, но вот с именами как разобраться?

anonymous

j=100
for i in `seq 1 100`; do
    mv -iv "file$i.gif" "$j.gif"
    j=$((j-1))
done

for i in *.gif; do
    mv -iv "$i" "file$i"
done

birdie ★★★★★
()

#!/bin/sh
for file in *.gif
do
  oldname=`echo $file | cut -d . -f 1 | sed  's/file//g'`
  newname=`expr $oldname - 1`
  mv $file file$newname.gif
done

grad
()

FIRST=1
LAST=100

#сохранить первый в отдельном файле
mv file$FIRST.gif file$FIRST.tmp

N=$[$LAST-1]
# в цикле 2->1, 3->2, ..., 100->99
for i in `seq $FIRST $N`; do
    j=$[$i+1]
    mv file$j.gif file$i.gif
done

# сохраненный (первый) --> в последний (100ый)
mv file$FIRST.tmp file$LAST.gif 

sdio ★★★★★
()
Ответ на: комментарий от anonymous

Балииин... Абалдеть! Скажите - в какую книгу уткнуться носом, чтобы больше не спрашивать и видеть решение самому?

Спасибо всем!

anonymous
()
Ответ на: комментарий от anonymous

Ищи в гугле: "Advanced Bash-Scripting Guide"

anonymous
()

Я на перле написал такое:

#!/usr/bin/perl -w

use strict;
use Getopt::Long qw(:config bundling);
use locale;
use POSIX qw(locale_h);
setlocale(LC_CTYPE, $ENV{'LANG'});

my $STEP = 1;
my ($n, $m, $l);

GetOptions(
        'step|s=i' => \$STEP
);


while (<STDIN>)
{
        if (m/(\d+)/)
        {
                $n = $m = $1;
                $l = length($n);
                $m += $STEP;
                $m = substr("0000000000000000000$m", -$l);
                print STDERR "$n ($l) -> $m\n";
                s/$n/$m/g;
        }
        print;
}

exit(0);

ip1981 ☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.