У меня такая структура каталогов:
./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), но ни один из скриптов, которые вы прислали здесь, не работает для меня до сих пор.
Как 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
Этот сценарий должен помочь:
#!/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
Так как Вы упомянули, что у Вас есть 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
. В целом, сценарий быстр и грязен, переименование трудно кодируется; можно было бы сказать, что это не идеально, но это работает.