[
] Я запустил Ubuntu 14.04 и должен был сделать 1 дополнительный шаг сверху по предложению MiGrieves, о котором я бы прочитал здесь - []https://askubuntu.com/a/387313[]. Короче говоря, мне нужно было зайти в "Правка -> Параметры профиля -> Название и Команда" и в выпадающем меню выбрать "Сохранить начальное название". Однако в поле "Начальное название" я оставил "Терминал"[
].
Итак, вы хотите выполнить команду в каждом каталоге дерева каталогов - текущий каталог, его подкаталоги, их подкаталоги и т.д. Первое, что нужно сделать, это перечислить соответствующие каталоги. С помощью команды find
сообщите ей список только каталогов:
find . -type d
Команда, которую требуется выполнить в каждом каталоге:
gmic ./*jpg -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg
Это команда оболочки, содержащая подстановочное расширение и подстановку команд. Для его выполнения необходимо запустить оболочку. Поскольку этой оболочке будет сказано, что делать, найти
, это не будет оболочка, которую вы запускаете найти
в: вы должны сказать найти
запустить оболочку. Передайте каталог, в котором вы хотите выступать в качестве аргумента, в оболочку.
find . -type d -exec sh -c '…' {} \;
Перед вызовом gmic
необходимо выполнить несколько действий в этом сценарии: перейти в соответствующий каталог и проверить, что он содержит файлы .jpg
.
find . -type d -exec sh -c '
cd "$0" || exit
set -- *.jpg
if [ -e "$1" ]; then
gmic "$@" -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o -0000."$(date)".jpg
fi
' {} \;
Также можно указать найти
для вывода списка файлов .jpg
. Однако это затрудняет выполнение команды только по одной на каталог.
Если оболочка является bash, в отличие от простой sh
, можно использовать ее * *
подстановочный символ для рекурсии в каталоги. Это проще, чем использовать найти
. В bash ≤4.2 следует помнить, что * *
также проходит символическую ссылку на каталоги. Вы также можете немного упростить проверку существования файла.
shopt -s globstar nullglob
for dir in ./**/*/; do
files=("$dir/"*.jpg)
if [[ ${#files[@]} -ne 0 ]]; then
gmic "${files[@]}" -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o "$dir/-0000.$(date)".jpg
fi
done
В zsh можно использовать модификатор истории в квалификаторе glob для перечисления каталогов, содержащих файлы .jpg
, а затем фильтровать результирующий массив для сохранения одной копии каждого каталога.
dirs=(./**/*.jpg(:h))
for dir in ${(u)dirs}; do
gmic $dir/*.jpg -gimp_montage 4,\""V(H(0,1),H(2,V(3,4)))"\",1,1.0,0,5,0,0,0,255,0,0,0,0 -o "$dir/-0000.$(date).jpg"
done
(Кроме: -0000.Sat Mar 14 15:51:28 CET 2015 .jpg
- это действительно странное имя для файла. Файлы, имя которых начинается с -
, как правило, вызывают проблемы, поскольку они похожи на параметры команд. Датами удобнее манипулировать в формате, где сортировка лексикографически идентична сортировке хронологически, например 20150314-145128
.)
OpenElec компилирует Python с отключенной поддержкой readline. Readline - это библиотека, используемая интерактивным интерпретатором Python, поэтому без нее клавиши курсора работать не будут.
Библиотека readline присутствует в системе, поэтому можно скомпилировать rlwrap (небольшую обертку, обеспечивающую выпуск командной строки readline для любой команды) и запустить rlwrap python
. Вам потребуется установить средства компиляции на наш компьютер Ubuntu, затем загрузить источник rlwrap и скомпилировать его. Альтернативно, может существовать подходящий двоичный код ARM rlwrap
.
Можно также установить rlwrap на ПК и запустить rlwrap ssh pi python
.
Оболочка считывает команды с вашего терминала (т.е. стандартный вход оболочки) до тех пор, пока ей не будет приказано остановиться (путем ввода команды exit
) или при обнаружении конца файла (EOF) (так же, как при выполнении скрипта оболочкой).
Если ввести команду exit
, она сначала будет сохранена в журнале, а затем оболочка будет закрыта. Ввод ctrl - D создает EOF; поскольку это не команда, а входное состояние, его невозможно сохранить в журнале оболочки.
Обратите внимание, что вы можете дать команду bash
игнорировать EOF; Это можно сделать 2 способами:
n
Первый способ эквивалентен IGNOREEOF = 10
, что означает, что перед выходом оболочки необходимо нажать ctrl - D 10 раз подряд. Это необходимо для предотвращения случайного завершения оболочки, например, при неправильном вводе ctrl - C или т.п.
Обратите внимание на то, что ctrl - D создает только EOF
при вводе в качестве первой вещи в строке (т.е. после ввода), bash
игнорирует его, если что-либо уже было набрано в строке.
ctrl - D также создает EOF
вне оболочки. Например:
$ wc
foo bar
<ctrl-D>
1 2 8
wc
насчитал 1 строку, 2 слова, 8 символов (включая новую строку).
Вот пример с использованием ctrl - D после того, как в строке был дан некоторый ввод:
$ wc
foo bar<ctrl-D><ctrl-D> 0 2 7
Теперь wc
отсчитал нулевые строки (не было дано enter
), 2 слова и 7 символы. Две последовательности ctrl - D были необходимы, поскольку данные уже были даны; обратите внимание, что bash
обрабатывает это специально (игнорируя EOF
, если что-то уже было введено в строку), тогда как, например, тире
нет. Вероятно, это связано со средством редактирования строк в bash
.
Если предложение @StéphaneChazelas об увеличении ServerAliveInterval
не работает (может быть, попробуйте значение 300
), то, возможно, вы захотите рассмотреть что-то вроде экрана GNU screen
или tmux
, чтобы можно было возобновить оборванные соединения.
У меня это в верхней части моего ~/.bashrc
на всех моих удаленных системах:
screen -r >/dev/null 2>&1
Это ничего не сделает, если у вас нет отключенного сеанса экрана (например, если это ваше второе соединение, или если вы только что перезагрузились), но если у вас есть сеанс экрана (который не подключен в другом месте), то он автоматически перезагрузит вас. Бам, вся Ваша предыдущая история (и активные команды и т.д.) восстанавливается. (Это предполагает, что вы запускаете screen
при первом входе в систему.)
Я также соединяю это с зацикленным SSH-соединением. Вот простая версия, чтобы проиллюстрировать то, о чем я говорю:
while sleep 1; do ssh remotehost; done
Таким образом, когда вы отключаетесь, вы автоматически восстанавливаете соединение (это даже прозрачно, предполагая, что у вас есть ключ ssh и вы используете ssh-agent
или ключ без пароля).