Как переименовать много файлов с помощью информации из отдельного .txt файла?

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

У меня есть много файлов (приблизительно 8 миллионов!) с именами такой как IR.AZR..SHE.D.2016.001.000000.SAC. Имена файлов следуют за этим форматом:

IR.(stations name)..(component).D.(year).(day).000000.sac

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

(station name).IR.(component).(year).(day).(begin time).(endtime).sac

Примечание: (day) находится в 365 форматах, или возможно я должен сказать, что это находится в формате Юлианской даты.

Текущее имя файла, наряду с дополнительной информацией, запрошенной для нового формата, хранится в файле простого текста:

screenshot of file names with additional data needed for renaming

В дополнение к снимку экрана вот часть из файла:

IR.AZR..SHE.D.2016.158.071819.SAC  2016 158  7 18 19 300        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072153.SAC  2016 158  7 21 53 540        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072251.SAC  2016 158  7 22 51  60        0.0000        8.1000
IR.AZR..SHE.D.2016.158.072315.SAC  2016 158  7 23 15 580        0.0000       16.3000
IR.AZR..SHE.D.2016.158.072340.SAC  2016 158  7 23 40 180        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072421.SAC  2016 158  7 24 21 300        0.0000        8.1000
IR.AZR..SHE.D.2016.158.072445.SAC  2016 158  7 24 45 980        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072518.SAC  2016 158  7 25 18  60        0.0000        7.3000
IR.AZR..SHE.D.2016.158.072541.SAC  2016 158  7 25 41 620        0.0000       32.9000
IR.AZR..SHE.D.2016.158.072647.SAC  2016 158  7 26 47 540        0.0000       16.4000
IR.AZR..SHE.D.2016.158.072712.SAC  2016 158  7 27 12 260        0.0000        8.1000
IR.AZR..SHE.D.2016.158.072736.SAC  2016 158  7 27 36 860        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072753.SAC  2016 158  7 27 53 340        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072809.SAC  2016 158  7 28  9 820        0.0000        8.1000
IR.AZR..SHE.D.2016.158.072904.SAC  2016 158  7 29  4 740        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072921.SAC  2016 158  7 29 21 220        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072954.SAC  2016 158  7 29 54  60        0.0000        8.2000
IR.AZR..SHE.D.2016.158.073035.SAC  2016 158  7 30 35 260        0.0000        8.1000
IR.AZR..SHE.D.2016.158.073059.SAC  2016 158  7 30 59 940        0.0000        8.2000
  • Первый столбец является списком моих файлов с их текущими именами файлов.
  • Вторым является столбец, представляет (year).
  • Третье (day) в формате Юлианской даты.
  • Восьмой и девятый столбец (begin time) и (end time), соответственно.

Членораздельно сценарий должен сделать следующее:

Сначала перечислите все файлы и затем найдите файл в этом .txt файл и соответствующая строка и столбец и переименовывают, как я сказал выше.

-1
задан 14 September 2018 в 01:46

3 ответа

То, что Вы спрашиваете, может быть легко выполнено с остротой Perl:

perl -lane '@a=split/\./,$F[0]; rename "old/$F[0]","new/$a[1].IR.$a[3].$F[1].$F[2].$F[7].$F[8].sac"' input.txt

Однако Ваша новая схема именования формата не кажется подходящей для Ваших входных файлов, так как она создаст двойные названия. Например:

IR.AZR..SHE.D.2016.158.071819.SAC  2016 158  7 18 19 300        0.0000        8.2000
IR.AZR..SHE.D.2016.158.072153.SAC  2016 158  7 21 53 540        0.0000        8.2000

оба переведет в: AZR.IR.SHE.2016.158.0.0000.8.2000.sac. Очевидно, может быть только один файл с данным именем файла в любой момент, и один из них будет потерян.

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

perl -lane '@a=split/\./,$F[0]; rename "old/$F[0]","new/$a[1].IR.$a[3].$F[1].$F[2].$a[7].$F[7].$F[8].sac"' input.txt

Тестовый прогон

Начальная файловая структура:

old:
IR.AZR..SHE.D.2016.158.071819.SAC
IR.AZR..SHE.D.2016.158.072153.SAC
IR.AZR..SHE.D.2016.158.072251.SAC
IR.AZR..SHE.D.2016.158.072315.SAC
IR.AZR..SHE.D.2016.158.072340.SAC
IR.AZR..SHE.D.2016.158.072421.SAC
IR.AZR..SHE.D.2016.158.072445.SAC
IR.AZR..SHE.D.2016.158.072518.SAC
IR.AZR..SHE.D.2016.158.072541.SAC
IR.AZR..SHE.D.2016.158.072647.SAC
IR.AZR..SHE.D.2016.158.072712.SAC
IR.AZR..SHE.D.2016.158.072736.SAC
IR.AZR..SHE.D.2016.158.072753.SAC
IR.AZR..SHE.D.2016.158.072809.SAC
IR.AZR..SHE.D.2016.158.072904.SAC
IR.AZR..SHE.D.2016.158.072921.SAC
IR.AZR..SHE.D.2016.158.072954.SAC
IR.AZR..SHE.D.2016.158.073035.SAC
IR.AZR..SHE.D.2016.158.073059.SAC

new:

Тестовый прогон с исходным форматом OP:

old:

new:
AZR.IR.SHE.2016.158.0.0000.16.3000.sac
AZR.IR.SHE.2016.158.0.0000.16.4000.sac
AZR.IR.SHE.2016.158.0.0000.32.9000.sac
AZR.IR.SHE.2016.158.0.0000.7.3000.sac
AZR.IR.SHE.2016.158.0.0000.8.1000.sac
AZR.IR.SHE.2016.158.0.0000.8.2000.sac

Тестовый прогон с измененным выходным форматом:

old:

new:
AZR.IR.SHE.2016.158.071819.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.072153.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.072251.0.0000.8.1000.sac
AZR.IR.SHE.2016.158.072315.0.0000.16.3000.sac
AZR.IR.SHE.2016.158.072340.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.072421.0.0000.8.1000.sac
AZR.IR.SHE.2016.158.072445.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.072518.0.0000.7.3000.sac
AZR.IR.SHE.2016.158.072541.0.0000.32.9000.sac
AZR.IR.SHE.2016.158.072647.0.0000.16.4000.sac
AZR.IR.SHE.2016.158.072712.0.0000.8.1000.sac
AZR.IR.SHE.2016.158.072736.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.072753.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.072809.0.0000.8.1000.sac
AZR.IR.SHE.2016.158.072904.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.072921.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.072954.0.0000.8.2000.sac
AZR.IR.SHE.2016.158.073035.0.0000.8.1000.sac
AZR.IR.SHE.2016.158.073059.0.0000.8.2000.sac
1
ответ дан 28 October 2019 в 00:19

Чистый Bash + mv(1)

while read -r current year day d e f g begin end; do
  station="${current:3:3}" component="${current:8:3}"
  mv -T -- "$current" "${station}.IR.${component}.${year}.${day}.${begin}.${end}.sac"
done < file-name-data.txt

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

Python 3

Острота (никакая обработка ошибок)

python3 -c 'import sys, os, re; for m in map(re.compile(sys.argv[1]).match, sys.stdin): os.rename(m.group("current"), sys.argv[2].format_map(m.groupdict()))' '(?P<current>IR\.(?P<station>\S+?)\.\.(?P<component>\S+?)\.\S*)\s+(?P<year>\S+)\s+(?P<day>\S+)\s+(?:\S+\s+){4}(?P<begin>\S+)\s+(?P<end>\S+)' '{station}.IR.{component}.{year}.{day}.{begin}.{end}.sac' < file-name-data.txt

Полная программа (с обработкой ошибок)

#!/usr/bin/python3
import sys, os, re

src_pattern = re.compile(
  r'(?P<current>IR\.(?P<station>\S+?)\.\.(?P<component>\S+?)\.\S*)\s+'
  r'(?P<year>\S+)\s+(?P<day>\S+)\s+'
  r'(?:\S+\s+){4}'
  r'(?P<begin>\S+)\s+(?P<end>\S+)'
)
dst_format = '{station}.IR.{component}.{year}.{day}.{begin}.{end}.sac'

for i, line in enumerate(sys.stdin, 1):
  m = src_pattern.match(line)
  if m:
    try:
      os.rename(m.group('current'), dst_format.format_map(m.groupdict()))
    except OSError as ex:
      print(ex, file=sys.stderr)
  else:
    print(
      'Non-matching source line {:d}: {!r}'.format(i, line.rstrip('\r\n')),
      file=sys.stderr)

Использование:

python3 rename.py < file-name-data.txt
1
ответ дан 28 October 2019 в 00:19

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

sudo apt install mmv

в окне терминала. Затем выполненный "человек mmv", чтобы видеть страницу руководства или посмотреть здесь: https://www.systutorials.com/docs/linux/man/1-mmv/

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

Существует также графический инструмент, filebot. Это записано в Java и работает на Ubuntu. Просто ищите его в хранилище программного обеспечения Ubuntu или установке с

sudo apt install filebot

Его основная цель является объемным переименованием видео и музыкальных файлов, и оно может использовать информацию о базе данных от MusicBrainz и так далее, но если я помню правильно (но проверьте его сами, потому что я не спал очень в эти выходные :)) также работает хорошо на наборы немедиа-файла. Их веб-сайт здесь: https://www.filebot.net/

0
ответ дан 28 October 2019 в 00:19

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

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