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

Профили для терминала GNOME хранятся в системе конфигурации GConf. Чтобы изменить их напрямую, нажмите Alt + F2, чтобы отобразить поле «Запустить команду», введите gconf-editor, а затем перейдите к /apps/gnome-terminal/profiles.

Снимите флажок /apps/gnome-terminal/profiles/Default/use_custom_command, чтобы решить вашу проблему.

Альтернативный способ выхода из этой ситуации - переопределить пользовательскую команду, указав другое в качестве аргумента командной строки, например gnome-terminal -x bash, еще раз в поле «Запустить команду».

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

6 ответов

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

#!/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
ответ дан 18 July 2018 в 06:31

Поскольку вы упомянули, что у вас есть 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
ответ дан 18 July 2018 в 06:31

Как предполагает 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 (verbose), и вы хотите видеть, что происходит, вы можете вместо этого получить bash, чтобы быть подробным, и дать вам подробное резюме того, что он делает, используя 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
ответ дан 18 July 2018 в 06:31

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

#!/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
ответ дан 24 July 2018 в 18:37
  • 1
    Я изменяю параметр параметра от -v до -n, но у него все еще есть проблема. script перемещает все папки из источника в destenition, но я не вижу никакого переименованного эффекта в файле в newpath. также вам нужно исправить эту строку «$ f3.txt» и изменить ее на «$ f3» .txt – lockheed 21 September 2017 в 08:41
  • 2
    Извините за отсутствующий ", и расширение должно было быть mpeg (я тестировал с .text), я проверил его, и он работает на моем конце. Возможно, вам придется изменить пути, чтобы заставить его работать. И fedora не в тему – George Udosen 21 September 2017 в 09:30
  • 3
    ваши файлы были переименованы в этот стиль по новому пути? BBC_english__09-19__20.00.mpeg ?? Я сохранил этот скрипт в файле .sh в родительском каталоге / BBC_English и запустил его. – lockheed 21 September 2017 в 09:46
  • 4
    Да, но в моем случае я использовал bbc вместо BBC_english! – George Udosen 21 September 2017 в 09:47
  • 5
    если мы проигнорировали ход, а другая команда может сказать мне, как я могу отфильтровать и выбрать имя папки родителей и взять некоторые символы даты и времени для нового файла? Мне нужна команда фильтрации для нового имени файла только now.like 2017-09-19.20.00.3-0.rec, что мне нужно захватить BBC-english_09-19_20.00. infact i need (satname_date_time) без 2017 в первом и .3-0.rec в конце нового имени файла – lockheed 21 September 2017 в 10:05

Поскольку вы упомянули, что у вас есть 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
ответ дан 24 July 2018 в 18:37
  • 1
    спасибо alot bro.but, к сожалению, я использовал компьютер Blackbox для моего VDR, который не может запускать скрипт Python на этом (старый и ограниченный список команд). Так что я предпочитаю команды обеда на нем в исходном командном режиме. Также у него нет никаких интернет-соединение (изолированный VDR) – lockheed 21 September 2017 в 11:54
  • 2
    @lockheed Вы упомянули Fedora 20, но машина без поддержки Python или mv -v не является Fedora, не так ли? Как и Ubuntu, Fedora имеет GNU Coreutils mv, который поддерживает -v. Если машина использует встроенный дистрибутив, скорее всего, использует BusyBox для своей оболочки и большинства команд, особенно потому, что BusyBox mv поддерживает только -f, -i и -n. Если вы отредактируете детали в своем вопросе - марку, модель, версию ОС / версию (если возможно), как вы к ней обращаетесь (SSH? Из Fedora?), И как часто переименование должно появиться (также один раз в час?) - я думаю, мы можем перенести его на Unix & Linux , где он по теме. – Eliah Kagan 21 September 2017 в 13:25
  • 3
    @ Eliah Kagan Да, я вижу на нем busybox. Это свежая версия fedora, но - v isnt в вариантах также он светлый и только скрипт vdr установлен на нем для записи телевизионных каналов. Я использую ssh для подключения через putty renaming, может запустить vua cron, чтобы вызвать sh-скрипт, который я думаю. Im newbi на этот сайт, если вы хотите перейти на другой, скажите мне сделать это. – lockheed 21 September 2017 в 21:01
  • 4
    @lockheed. Вы должны быть свободны публиковать это в другом месте. Но, как написано, скорее всего, (a) получит ответы, которые не учитывают ограничения, с которыми вы работаете в учете, как это произошло здесь, в Ask Ubuntu, или (b) [ ! d1] быть закрытым, как неясно. После того, как он полностью описывает то, что вам нужно, ваш вопрос может быть перенесен на Unix & Linux , без необходимости его перепрограммировать. Если вы думаете, что это возможно, вы должны нажать ссылку edit прямо под своим вопросом и добавить информацию, указанную здесь в своем комментарий, а также другие подробности, которые я запросил в своих предыдущих комментариях здесь и по вопросу. – Eliah Kagan 22 September 2017 в 13:56

Как предполагает 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 (verbose), и вы хотите видеть, что происходит, вы можете вместо этого получить bash, чтобы быть подробным, и дать вам подробное резюме того, что он делает, используя 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
ответ дан 24 July 2018 в 18:37
  • 1
    Я бы сказал, чтобы последний фрагмент кода получил полный скрипт, добавив к нему строку #!. Кроме того, стоит отметить для n00bz, что ./ означает, что нужно запустить такую ​​команду из каталога на один уровень выше BBC_english. – Sergiy Kolodyazhnyy 21 September 2017 в 11:18
  • 2
    старая тема, мы были над этим раньше тысяч раз. Вопрос по-прежнему полезен для пользователей Ubuntu. Пока это работает на нашей платформе, это все, что имеет значение. – Sergiy Kolodyazhnyy 21 September 2017 в 11:24

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

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