Linux / Как переименовать файлы рекурсивно с помощью COUNTER [duplicate]

Для HTML5 html5 lib был оставлен уже много лет. Единственная библиотека HTML5, которую я могу найти с недавними записями обновления и обслуживания, - это html5-php , который чуть больше недели назад был добавлен в бета 1.0.

165
задан Tim Castelijns 5 January 2016 в 16:46
поделиться

22 ответа

Попробуйте использовать петли, let и printf для заполнения:

a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
  mv -i -- "$i" "$new"
  let a=a+1
done

, используя флаг -i, предотвращает автоматическую перезапись существующих файлов.

239
ответ дан gauteh 26 August 2018 в 09:24
поделиться

Чтобы работать во всех ситуациях, поместите «\» для файлов с пробелом в имени

find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
11
ответ дан Abdala Cerqueira 26 August 2018 в 09:24
поделиться

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

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

#!/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); 
}
0
ответ дан Andy Beverley 26 August 2018 в 09:24
поделиться

Вы также можете использовать ls

ls *.JPG| awk 'BEGIN{ a=0 }{ printf "mv %s gopro_%04d.jpg\n", $0, a++ }' | bash
1
ответ дан bartburkhardt 26 August 2018 в 09:24
поделиться

, используя решение Pero на OSX, потребовало некоторой модификации. Я использовал:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

примечание: обратные косые черты существуют для продолжения строки

edit 20 июля 2015 года: включен @ klaustopher, чтобы указать аргумент \"%s\" команды mv, чтобы поддерживать имена файлов с пробелами.

28
ответ дан beibei2 26 August 2018 в 09:24
поделиться
a=1

for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done
0
ответ дан beresfordt 26 August 2018 в 09:24
поделиться

Красота в одной строке

ls | cat -n | while read n f; do mv "$f" "$n.extension"; done 

изменить расширение с помощью нужного PNG, Jpg или некоторого другого.

150
ответ дан blueseal 26 August 2018 в 09:24
поделиться

Этот скрипт будет сортировать файлы по дате создания в Mac OS bash. Я использую его для массового переименования видео. Просто измените расширение и первую часть имени.

ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash
1
ответ дан Community 26 August 2018 в 09:24
поделиться

Этот oneliner перечисляет все файлы в текущем каталоге, сортирует по временной отметке создания в обратном порядке (означает, что самый старый файл находится в начале) и автоматически переименовывает с завершающими нулями в соответствии с количеством файлов. Расширение файла будет сохранено.

У меня обычно есть только одна папка с годами для фотографий и фильмов для мобильных телефонов. Применяя эту команду, мои фотографии и видеоролики будут готовы для слайд-шоу в правильном порядке на телевизоре или в архиве.

Имейте в виду, что если вы столкнулись с именами имен файлов, вы теряете файлы. Поэтому сначала переименуйте что-то нечетное, как temp001.jpg, а затем выполните свое окончательное имя файла.

DIGITS=$(ls | wc -l | xargs | wc -c | xargs); ls -tcr | cat -n | while read n f; do mv "$f" "$(printf "%0${DIGITS}d" $n).${f##*.}"; done
0
ответ дан Flavio Aiello 26 August 2018 в 09:24
поделиться

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

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

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

-1
ответ дан Frank Nocke 26 August 2018 в 09:24
поделиться

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

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

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

-2
ответ дан JochenJung 26 August 2018 в 09:24
поделиться

Если ваш rename не поддерживает -N, вы можете сделать что-то вроде этого:

ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

Изменить Чтобы начать с заданного числа, вы можете использовать (несколько уродливые ) ниже, просто замените 123 номером, который вы хотите:

ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

Это упорядочивает файлы по времени создания (сначала сначала добавьте -r в ls, чтобы отменить сортировку), а затем отправляет этот список файлов для переименования. Переименование использует Perl-код в регулярном выражении для форматирования и увеличения счетчика.

Однако, если вы имеете дело с изображениями JPEG с информацией EXIF, я бы рекомендовал exiftool

. Это из документации exiftool в разделе «Примеры переименования»

   exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir

   Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
   preserving the original file extension (%e).  Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.
7
ответ дан Luke H 26 August 2018 в 09:24
поделиться

Ответ Pero заставил меня здесь:)

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

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
-2
ответ дан marikhu 26 August 2018 в 09:24
поделиться
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'

rename -vn - удалить n для режима без теста

{$ i = 1;} - номер запуска управления

"% 04d.jpg" - контрольный счет ноль 04 и установить выходное расширение .jpg

0
ответ дан maXp 26 August 2018 в 09:24
поделиться

Мне эта комбинация ответов работала отлично:

ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash
  • ls -v помогает с упорядочением 1 10 9 в правильном порядке: 1 9 10, избегая проблем с расширением имени файла с jpg JPG jpeg
  • gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' renumbers с 4 символами и ведущими нулями. Избегая mv, я случайно не пытаюсь перезаписать все, что уже есть, случайно получив одинаковое число.
  • bash выполняет

Помните, что @xhienne сказал, что неизвестный контент трубопровода в bash представляет собой угрозу безопасности. Но это не было для меня, поскольку я использовал свои отсканированные фотографии.

0
ответ дан nintendojet 26 August 2018 в 09:24
поделиться

Здесь другое решение с командой «rename»:

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'
-1
ответ дан panticz.de 26 August 2018 в 09:24
поделиться

У меня была аналогичная проблема и по этой причине написал сценарий оболочки. Я решил опубликовать его независимо от того, что было опубликовано много хороших ответов, потому что я думаю, что это может быть полезно для кого-то. Не стесняйтесь улучшать его!

numberate

@Gnutt Поведение, которое вы хотите, может быть достигнуто, введя следующее:

./numerate.sh -d <path to directory> -o modtime -L 4 -b <startnumber> -r

Если опция -r не используется, только для имитации синтаксиса (должно быть полезно для тестирования).

. В тексте L описывается длина целевого номера (который будет заполнен ведущими нулями), также возможно добавьте префикс / суффикс с параметрами -p <prefix> -s <suffix>.

Если кто-то хочет, чтобы файлы сортировались численно до их нумерации, просто удалите опцию -o modtime.

1
ответ дан Paul Weibert 26 August 2018 в 09:24
поделиться

Мне нравится решение gauteh для его простоты, но оно имеет важный недостаток. При запуске на тысячах файлов вы можете получить сообщение «слишком длинный список аргументов» ( больше на этом ), а во-вторых, скрипт может стать очень медленным. В моем случае, запуская его примерно на 36 000 файлов, скрипт перемещался ок. один пункт в секунду! Я не уверен, почему это происходит, но правило, которое я получил от коллег, было «find - ваш друг» .

find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

Чтобы подсчитать элементы и выполнить команду , gawk . Обратите внимание на основное отличие. По умолчанию find ищет файлы в текущем каталоге и его подкаталогах, поэтому обязательно удаляйте поиск только в текущем каталоге (используйте man find, чтобы увидеть, как).

59
ответ дан Pero 26 August 2018 в 09:24
поделиться

с командой «rename»

rename -N 0001 -X 's/.*/$N/' *.jpg

или

rename -N 0001 's/.*/$N.jpg/' *.jpg
23
ответ дан Roman Rhrn Nesterov 26 August 2018 в 09:24
поделиться

Очень простой bash один лайнер, который сохраняет исходные расширения, добавляет ведущие нули, а также работает в OSX:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

Упрощенная версия http://ubuntuforums.org/showthread .php? т = 1355021

16
ответ дан Roy Shilkrot 26 August 2018 в 09:24
поделиться

Опять же, используя решение Pero с небольшим изменением, потому что find будет перемещаться по дереву каталогов в элементах заказа, хранящихся в записях каталога. Это будет (в основном) быть последовательным от запуска до запуска на том же компьютере и по существу будет «порядком создания файла / каталога», если не было удалений.

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

find -name '*.jpg' | sort -n | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command 
1
ответ дан Serge Stroobandt 26 August 2018 в 09:24
поделиться

В OSX установите скрипт переименования из Homebrew:

brew install rename

. Тогда вы можете сделать это очень смешно:

rename -e 's/.*/$N.jpg/' *.jpg

Или добавить красивый префикс:

rename -e 's/.*/photo-$N.jpg/' *.jpg
4
ответ дан trisweb 26 August 2018 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: