суббота, 11 августа 2018 г.

Копирование с преобразованием...

Иногда возникает необходимость перекладывать файлы с каким-либо преобразованием, но на новом месте иметь такие же названия папок, как и в предыдущем, можно, конечно, вручную, в каждой папке конвертировать с указанием нового места, но можно и автоматизировать:
$ IFS=$'\n' ; for i in $( find . -name "*.mp4" ) ; do destfolder=~/aac ; namefolder=$( dirname $i ) ; if [[ ! -d $destfolder/$namefolder ]] ; then mkdir -p $destfolder/$namefolder ; fi ; ffmpeg -i $i -map_metadata 0 -vn -acodec copy $destfolder/$namefolder/$i.m4a ; done
Или, к примеру, синхронизация:
IFS=$'\n' ; for i in $( find . -iname "*menu.lst" ) ; do destfolder=grub4dos_menu/ ; namefolder=$( dirname $i ) ; if [[ ! -d $destfolder/$namefolder ]] ; then mkdir -p $destfolder/$namefolder ; fi ;  cp $i  $destfolder/$namefolder ; done
То есть аналог команды rsync -va ./sourcefolder ./destfolder

Обратите внимание на логический операнд -d - условие верно если $destfolder/$namefolder уже имеется  и является папкой, если вместо -d вы используете -z то будет создаваться лишняя (пустая папка). Установка переменной IFS нужна чтобы правильно обрабатывать пробелы в именах файлов и папок. Оператор -map_metadata 0 для ffmpeg в первом примере нужен для переноса тегов из источника в результат.

пятница, 3 августа 2018 г.

Программы в фоне

До сих чтобы запускать программы в фоне, я использовал менеджер виртуальных окон - screen, с опциями -d -m, что неудобно для программ, имеющих собственные управляющие клавиши, так у screen есть собственные управляющие клавиши, и они более приоритетны. Оказалось есть более экономный способ запускать, а затем соединяться с запущенными процессами

Запускаем:
<программа> &
Узнаём какие процессы есть:
jobs -l
Из списка процессов можно запустить любую задачу:
fg <задача>
Для перевода уже запущенных программ в фоновый (или для восстановления сессии случайно остановленных по ctrl-z) можно использовать ctrl-z (не всегда: программы обрабатывающие вызовы с клавиатуры, могут не допускать эту комбинацию, но для консольных задач вполне достаточно), после чего нужно ввести bg (можно без параметра, тогда в фон перейдёт последняя остановленная задача), и чтобы подключиться к ней - fg (тоже: без параметров - последняя поставленная в фон задача).

Ссылки. Спасибо огромное авторам блогов:
Coder Booster: Фоновый режим в Linux. Как запустить программу без блокировки терминала?
RTFM: Linux: jobs, fg, bg – управление фоновыми процессами