Я полагаю, что эта проблема может быть решена со сценарием удара, но я - все еще новичок, таким образом, я нуждаюсь в Вашей помощи здесь.
У меня есть много файлов (приблизительно 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 форматах, или возможно я должен сказать, что это находится в формате Юлианской даты.
Текущее имя файла, наряду с дополнительной информацией, запрошенной для нового формата, хранится в файле простого текста:
В дополнение к снимку экрана вот часть из файла:
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
файл и соответствующая строка и столбец и переименовывают, как я сказал выше.
То, что Вы спрашиваете, может быть легко выполнено с остротой 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
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
для каждого из них. Следовательно, почему я рекомендую альтернативу ниже.
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
Существует инструмент командной строки, несколько перемещаются. Это позволяет Вам переместиться (который является, также переименовывают), копия, и т.д., на основе шаблонов. Установите его с
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/