Переименовать несколько последовательно пронумерованных файлов и изменить формат нумерации с помощью BASH? - PullRequest
0 голосов
/ 23 сентября 2010

У меня есть куча последовательно именованных файлов в этом формате: imageXXX.jpg.Так было бы как image001.jpg и так далее.Я просто хочу сохранить номерную часть этого и избавиться от добавленных 0.Поэтому вместо этого этот файл будет называться 1.jpg.Как я могу добиться этого с помощью Bash?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2010

Pure Bash:

shopt -s extglob
for f in image*.jpg; do mv "$f" "${f/#image*(0)}"; done

Дополнительный код может проверять конфликт имен или обрабатывать другие ошибки.Вы можете использовать mv -i для запроса перед перезаписью файлов.

2 голосов
/ 23 сентября 2010

В Linux почтенная утилита Perl переименовывает дружественна:

$ rename 's/^image0+//' image*.jpg

Вы должны знать, что удаление ведущих нулей разрушит порядок сортировки, то есть *.jpg порядков, таких как:

1.jpg
10.jpg
11.jpg
...
2.jpg
20.jpg

Если вы хотите сохранить порядок, просто используйте

$ rename 's/^image//' image*.jpg

вместо.

добавлено в ответ на идентификацию системы

Скорее всего, вы можете написать скрипт только на bash, но это было бы нетривиально, и случаи сбоев действительно должны обрабатываться правильно. Да, поднять Perl на систему тоже нетривиально, но это легко, и это колесо уже изобретено

Fedora Core 8 Perl RPM: http://rpm.pbone.net/index.php3/stat/4/idpl/5152898/dir/fedora_8/com/perl-5.8.8-30.n0i.51.fc8.i386.rpm.html
CPAN переименовать: http://metacpan.org/pod/File::Rename

добавлено в ответ на тихий сбой

rename как chmod будет жаловаться, если вы дадите ему некорректные аргументы, но оба молчат, если то, что вы запрашиваете, не имеет никакого эффекта. Например

$ ls -l junk
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 junk
$ chmod 688 junk
chmod: invalid mode: '688'
$ chmod 644 junk    # was already 644 mode, nothing happened no error
$ rename 's/bob/alice/' ju*k    
# there was no 'bob' in 'junk' to substitute, no change, no error
$ ls -l junk
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 junk
$ rename 's/un/ac/' j*k  # but there is an 'un' in 'junk', change it
$ ls -l j*k
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 jack

Вы можете сделать rename менее тихим:

$ rename --verbose 's/ac/er/' j*k
jack renamed as jerk
$ rename --verbose 's/ac/er/' j*k   # nothing to rename
$                  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...