Переименование файлов в папке на последовательные номера - PullRequest
197 голосов
/ 09 июля 2010

Я хочу переименовать файлы в каталоге в последовательные номера. На основе даты создания файлов.

Например, от sadf.jpg до 0001.jpg, от wrjr3.jpg до 0002.jpg и т. Д., Число ведущих нулей в зависимости от общего количества файлов (нет необходимости в дополнительных нулях, если не нужно).

Ответы [ 25 ]

0 голосов
/ 12 декабря 2016

Ответ Перо привел меня сюда:)

Я хотел переименовать файлы относительно времени, поскольку программы просмотра изображений не отображали изображения в порядке времени.

ls -tr *.jpg | # list jpegs relative to time
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
0 голосов
/ 02 ноября 2016

Отсортировано по времени, ограничено jpg, ведущими нулями и базовым именем (на случай, если вы, вероятно, захотите):

ls -t *.jpg | cat -n |                                           \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done

(все в одной строке, без \)

0 голосов
/ 07 ноября 2014

Вот еще одно решение с командой «переименовать»:

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'
0 голосов
/ 09 ноября 2015

Для нумерации 6000 файлов в одной папке вы можете использовать опцию «Переименовать» программы ACDsee.

Для определения префикса используйте этот формат: ####"*"

Затем установите начальный номер и нажмите Rename, и программа переименует все 6000 файлов с последовательными номерами.

0 голосов
/ 23 ноября 2015

Большинство других решений будут перезаписывать существующие файлы, уже названные как числа.Это особенно проблема, если запустить скрипт, добавить другие файлы и запустить скрипт снова.

Этот скрипт сначала переименовывает существующие числовые файлы:

#!/usr/bin/perl

use strict;
use warnings;

use File::Temp qw/tempfile/;

my $dir = $ARGV[0]
    or die "Please specify directory as first argument";

opendir(my $dh, $dir) or die "can't opendir $dir: $!";

# First rename any files that are already numeric
while (my @files = grep { /^[0-9]+(\..*)?$/ } readdir($dh))
{
    for my $old (@files) {
        my $ext = $old =~ /(\.[^.]+)$/ ? $1 : '';
        my ($fh, $new) = tempfile(DIR => $dir, SUFFIX => $ext);
        close $fh;
        rename "$dir/$old", $new;
    }
}

rewinddir $dh;
my $i;
while (my $file = readdir($dh))
{
    next if $file =~ /\A\.\.?\z/;
    my $ext = $file =~ /(\.[^.]+)$/ ? $1 : '';
    rename "$dir/$file", sprintf("%s/%04d%s", $dir, ++$i, $ext); 
}
...