Переименовать файлы в соответствии с родительскими папками и переместить в новое место [закрыто]

У меня такая структура каталогов:

./BBC_english/

 2017-09-19.20.00.3-0.rec/00001.mpeg
 2017-09-19.21.00.3-0.rec/00001.mpeg
 2017-09-19.22.00.3-0.rec/00001.mpeg
 2017-09-19.23.00.3-0.rec/00001.mpeg

И мне нужно переименовать 00001.mpeg как родительские папки вот так для каждой папки в . / Мне нужна дата дня и время записи в этом формате например - мне не нужно 2017 в новых именах файлов

И в конце мне нужно переместить все переименованные mpeg файлы в новый путь вот так :

./newpath/

BBC_english__09-19__20.00.mpeg   
BBC_english__09-19__21.00.mpeg    
BBC_english__09-19__22.00.mpeg
BBC_english__09-19__23.00.mpeg

Во-первых, я использую Fedora 20 (я знаю, что здесь форум Ubuntu) и когда я выполняю команду mv, она не поддерживает опцию -v и имеет только эту опцию:

-f -i -n

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

Поэтому мне нужен рекурсивный скрипт, чтобы сделать это для всех файлов в исходной папке только для .mpeg файла (я буду использовать скрипт после того, что работал для меня в cron), но ни один из скриптов, которые вы прислали здесь, не работает для меня до сих пор.

1
задан 21 September 2017 в 10:13

3 ответа

Как heemayl предполагает в ответе на связанное сообщение, Вы могли использовать ряд расширений оболочки.

Принятие текущего рабочего каталога является родителем и источника и места назначения, Вы могли использовать этот цикл в системе Ubuntu:

$ for d in ./BBC_english/*; do e="${d##*2017-}"; f="${e%%.[0-9]-[0-9].rec}"; g="${f/./__}"; echo mv -v -- "$d"/* ./newpath/BBC_english__"$g".mpeg; done
mv -v -- ./BBC_english/2017-09-19.20.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__20.00.mpeg
mv -v -- ./BBC_english/2017-09-19.21.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__21.00.mpeg
mv -v -- ./BBC_english/2017-09-19.22.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__22.00.mpeg
mv -v -- ./BBC_english/2017-09-19.23.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__23.00.mpeg

Примечание, которое мы циклично выполняем по каталогам, а не файлам. Это предполагает, что у Вас действительно только есть один файл в каждом каталоге, который, кажется, случай, учитывая логику.

Удаляют echo после тестирования для фактического перемещения файлов. Затем -v причины mv для создания отчетов, что это делает.

, Если Ваш mv не поддерживает -v (подробный) флаг и Вы хочет видеть то, что происходит, можно вместо этого заставить удар быть подробным и дать Вам подробную сводку того, что это делает использование set -x

#!/bin/bash
set -x

for d in ./BBC_english/*; do 
   e="${d##*2017-}"            # remove everything before and including 2017-
   f="${e%%.[0-9]-[0-9].rec}"  # remove the trailing numbers and `.rec`
   g="${f/./__}"               # replace the first `.` with `__`
 echo mv -- "$d"/* ./newpath/BBC_english__"$g".mpeg
 # move to the new path using the edited directory name
done

, вывод этого после удаления echo включал бы результат каждого расширения и mv оператор для каждого повторения цикла. Для первого повторения вывод был бы похож на это:

+ for d in ./BBC_english/*
+ e=09-19.20.00.3-0.rec
+ f=09-19.20.00
+ g=09-19__20.00
+ mv -- ./BBC_english/2017-09-19.20.00.3-0.rec/00001.mpeg ./newpath/BBC_english__09-19__20.00.mpeg
2
ответ дан 3 December 2019 в 06:53

Этот сценарий должен помочь:

#!/bin/bash  

for i in ./BBC_english/*; do
        # Get the path to the file
        path=$(dirname "$(readlink -f "$i")")         

        # get the names for file rename
        f2=$( echo "$path" | grep -Eo "\-[0-9]{2}-[0-9]{2}" | grep -Eo "[0-9]{2}-[0-9]{2}")            
        f1=$( echo "$path" | grep -Eo BBC_english )           
        f3=$(echo "$path" | grep -Eo "\.[0-9]{2}\.[0-9]{2}" | grep -Eo "[0-9]{2}\.[0-9]{2}")                       
        # Rename the files           
        mv -n "$i" ./newpath/"$f1"__"$f2"__"$f3".mpeg

done
0
ответ дан 3 December 2019 в 06:53

Так как Вы упомянули, что у Вас есть Fedora, вот сценарий Python для Вас, который использует синтаксис Python 2, который должен работать без любых проблем или различий на обеих Ubuntu или Fedora. (Было бы хорошо использовать prename какие производные Debian поставлются по умолчанию, но к сожалению Fedora не делает. Я оставлю это как осуществление для будущего, и prename все еще полезно для пользователей Ubuntu.)

Вот сам сценарий:

#!/usr/bin/env python

import os
import sys
import shutil

def find_files(start_dir):
    ext_paths = []
    for root,dirs,files in os.walk(start_dir):
        if root == start_dir: continue        
        ext_paths = ext_paths + map( lambda x: os.path.join(root,x),files )
    return ext_paths

def alter_path(path,new_dir):
    newpath = path.replace(".3-0.rec/00001","").replace("2017-","")
    newpath = newpath.replace("BBC_english/","BBC_english__").replace("19.","19__")
    return os.path.join(new_dir,newpath)    

def main():
    for i in find_files(sys.argv[1]):
        print(i,alter_path(i,sys.argv[2]))
        shutil.copy(i,alter_path(i,sys.argv[2]))

if __name__ == '__main__':
    main()

Здесь это в действии:

$ ./rename_mpegs.py  BBC_english/ newpath/                                                                                        
('BBC_english/2017-09-19.23.00.3-0.rec/00001.mpeg', 'newpath/BBC_english__09-19__23.00.mpeg')
('BBC_english/2017-09-19.20.00.3-0.rec/00001.mpeg', 'newpath/BBC_english__09-19__20.00.mpeg')
('BBC_english/2017-09-19.22.00.3-0.rec/00001.mpeg', 'newpath/BBC_english__09-19__22.00.mpeg')
('BBC_english/2017-09-19.21.00.3-0.rec/00001.mpeg', 'newpath/BBC_english__09-19__21.00.mpeg')
$ tree newpath/                                                                                                                   
newpath/
├── BBC_english__09-19__20.00.mpeg
├── BBC_english__09-19__21.00.mpeg
├── BBC_english__09-19__22.00.mpeg
└── BBC_english__09-19__23.00.mpeg

Я предложил бы, чтобы Вы заменили shutil.copy() часть с shutil.move(), или можно просто избавиться от старого каталога в конце, но я оставлю это до Вас для решения.

Правила просты: назовите сценарий с источником как аргумент 1 и место назначения как аргумент 2 к сценарию из каталога один уровень выше BBC_english. В целом, сценарий быстр и грязен, переименование трудно кодируется; можно было бы сказать, что это не идеально, но это работает.

2
ответ дан 3 December 2019 в 06:53

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

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