Переименование нескольких файлов со сложными пронумерованными именами

У меня есть 365 файлов с именем

MOD11A1.A2010001.h24v06.006.2016025150444.hdf
MOD11A1.A2010002.h24v06.006.2016025151748.hdf
MOD11A1.A2010003.h24v06.006.2016025163706.hdf

, и я хочу переименовать эти файлы как:

modis1.hdf
modis2.hdf
modis3.hdf

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

Как мне достичь этого за один раз?

6
задан 22 November 2017 в 10:16

4 ответа

Поскольку вам важен только бит A2010..., используйте rename в каталоге с файлами:

rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *

Пример:

$ rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
rename(> MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis1.hdf)
rename(> MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis2.hdf)
rename(> MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis3.hdf)
rename(> MOD11A1.A2010365.h24v06.006.2016025150444.hdf, modis365.hdf)

Запуск без -n на самом деле переименовать файлы.

10
ответ дан 22 November 2017 в 10:16

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

for f in MOD*.hdf; do
  num="${f:13:3}"
  mv "$f" modis"$((10#$num))".hdf
done

Или как однострочный:

for f in MOD*.hdf; do num="${f:13:3}"; mv "$f" modis"$((10#$num))".hdf ; done

Это переместит файлы так, как вы просили, означая, что MOD11A1.A2010001.h24v06.006.2016025150444.hdf станет modis1.hdf, MOD11A1.A2010002.h24v06.006.2016025151748.hdf становится modis2.hdf и т. д.

6
ответ дан 22 November 2017 в 10:16

Вы можете использовать команду rename следующим образом:

$ rename -n 's/MOD11A1\.A2010(...)\..*/modis$1.hdf/' MOD*.hdf
rename(MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis001.hdf)
rename(MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis002.hdf)
rename(MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis003.hdf)

После тестирования удалите -n, чтобы фактически переименовать файлы.

Примечания

  • s/old/new заменяют old на new
  • \. буквальный .
  • ... три символа, которые могут быть чем-нибудь
  • (some chars) сохранить some chars, чтобы ссылаться позже с $1
  • Мы могли бы использовать простое регулярное выражение для соответствия первой части имени файла в команде rename, как ответ Муру делает. Иногда вы хотите использовать более явное выражение, чтобы различать файлы, над которыми вы работаете или не хотите действовать, или чтобы убедиться, что ваше регулярное выражение не будет всасывать слишком много символов. В решении этой проблемы обычно достаточно гибкости.

Обратите внимание, что этот не дает именно того, о чем вы просили; он поддерживает фиксированную ширину чисел. Я сделал это, потому что это хорошая идея использовать числа с фиксированной шириной в именах файлов (в противном случае они будут отсортированы в замешательстве, например, с 10 до 2) (и , потому что я не понял, как используйте rename для создания имен, которые вы на самом деле просили ... если я это сделаю, я обновлю свой ответ ответ муру сделает это ...).

Обратите внимание, что Perl rename не включен в установку по умолчанию 17.10 , поэтому, если вы работаете с 17.10 (или для будущих читателей, возможно, более поздней версией), начните с запуска

sudo apt install rename
6
ответ дан 22 November 2017 в 10:16
  • 1
    Первая часть don' t понимают, то, как настроить запасной интерфейс для тонкого клиента. У меня только есть одна сетевая плата, и оба компьютера присоединены к маршрутизатору. У меня может быть два сетевых интерфейса на том же компьютере, пока у них есть различные IP-адреса? – Balthazar 19 May 2012 в 19:45
  • 2
    Первая часть don' t понимают, то, как настроить запасной интерфейс для тонкого клиента. У меня только есть одна сетевая плата, и оба компьютера присоединены к маршрутизатору. У меня может быть два сетевых интерфейса на том же компьютере, пока у них есть различные IP-адреса? – Balthazar 19 May 2012 в 19:45
  • 3
    Первая часть don' t понимают, то, как настроить запасной интерфейс для тонкого клиента. У меня только есть одна сетевая плата, и оба компьютера присоединены к маршрутизатору. У меня может быть два сетевых интерфейса на том же компьютере, пока у них есть различные IP-адреса? – Balthazar 19 May 2012 в 19:45
  • 4
    Первая часть don' t понимают, то, как настроить запасной интерфейс для тонкого клиента. У меня только есть одна сетевая плата, и оба компьютера присоединены к маршрутизатору. У меня может быть два сетевых интерфейса на том же компьютере, пока у них есть различные IP-адреса? – Balthazar 19 May 2012 в 19:45
  • 5
    Первая часть don' t понимают, то, как настроить запасной интерфейс для тонкого клиента. У меня только есть одна сетевая плата, и оба компьютера присоединены к маршрутизатору. У меня может быть два сетевых интерфейса на том же компьютере, пока у них есть различные IP-адреса? – Balthazar 19 May 2012 в 19:45
  • 6
    Первая часть don' t понимают, то, как настроить запасной интерфейс для тонкого клиента. У меня только есть одна сетевая плата, и оба компьютера присоединены к маршрутизатору. У меня может быть два сетевых интерфейса на том же компьютере, пока у них есть различные IP-адреса? – Balthazar 19 May 2012 в 19:45

Приведенный ниже код выполняет следующие действия:

  1. перебирает все файлы, которые начинаются с MOD и заканчиваются .hdf
  2. . Назначьте переменную, которая увеличит ее значение в 1 для каждого файла
  3. выполнить команду mv для текущего файла в списке и изменить его имя на modis, следуя по номеру из переменной, следуя .hdf

    #!/bin/bash 
    idx=1
    for file in MOD*.hdf
    do
        echo mv "$file" "modis$((idx++)).hdf"
    done
    

Примечание: приведенный выше скрипт будет только echo команду, которую он планирует выполнить, вам нужно удалить echo из строки echo mv, чтобы выполнить действие действие.

Пример вывода:

mv MOD11A1.A2010001.h24v06.006.2016025150444.hdf modis1.hdf
mv MOD11A1.A2010002.h24v06.006.2016025151748.hdf modis2.hdf
mv MOD11A1.A2010003.h24v06.006.2016025163706.hdf modis3.hdf
5
ответ дан 22 November 2017 в 10:16
  • 1
    да у Вас может быть 2 NICs в той же системе – Mitch♦ 19 May 2012 в 23:18
  • 2
    да у Вас может быть 2 NICs в той же системе – Mitch♦ 19 May 2012 в 23:18
  • 3
    да у Вас может быть 2 NICs в той же системе – Mitch♦ 19 May 2012 в 23:18
  • 4
    да у Вас может быть 2 NICs в той же системе – Mitch♦ 19 May 2012 в 23:18
  • 5
    да у Вас может быть 2 NICs в той же системе – Mitch♦ 19 May 2012 в 23:18
  • 6
    да у Вас может быть 2 NICs в той же системе – Mitch♦ 19 May 2012 в 23:18

Другие вопросы по тегам:

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