• Изменение названия русских названий файлов при распаковке zip архива?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    $ convmv --unescape --notest %D0%BF1%D0%BF.jpg
    mv "./%D0%BF1%D0%BF.jpg"	"./п1п.jpg"
    Ready! I converted 1 files in 0 seconds.
    Ответ написан
    2 комментария
  • Перенос Ubuntu с SSD на NVMe, проверить NVMe?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    решение в комментариях к вопросу
    Ответ написан
    Комментировать
  • Парсинг файла bash?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    В скрипте bash я создаю переменную которая вытаскивает из этой строки S4BZJ045 следующим образом:
    SystemName=$(cat server_out.db | grep 'SystemName' | awk '{print $2}' )

    слишком многословная команда, можно сократить:
    SystemName=$(awk '/SystemName/{printf $2}' server_out.db)


    В ответ получаю NotOK, я понимаю, что проблема в лишних символах в переменной SystemName. Проверял через WC:

    скорее всего проблема в переводе строки, print в конце ставит \n, чтобы этого избежать используйте printf
    Ответ написан
    1 комментарий
  • Как управлять браузером параллельно другим приложениям?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    устанавливаем mpv и yotube-dl
    далее, запускаем в консоли IPC-сервер и видео с нужным роликом (пример):
    mpv --input-ipc-server=/tmp/mpvsocket "https://www.youtube.com/watch?v=GYE2P7BWBAs"

    (при желании можно еще дополнительно установить браузерное расширение для запуска команды(видео) чтобы каждый раз не лезть в консоль)
    в другой консоли набираем команды (пример):
    echo '{ "command": ["set_property", "pause", true] }' | socat - /tmp/mpvsocket

    поставить на паузу

    echo '{ "command": ["set_property", "pause", false] }' | socat - /tmp/mpvsocket

    продолжить воспроизведение

    (детальнее смотри mpv:JSON IPC )
    в общем, вешаем данные команды на горячие клавиши и вуаля

    п.с.
    последние две команды пауза и воспроизведение можно записать немного проще и в одной команде:
    echo "cycle pause" | socat - /tmp/mpvsocket
    если пауза то начнёт воспроизведение, а если воспроизводится то ставит на паузу.
    Ответ написан
    Комментировать
  • Как реализовать парсинг параметров, введённых в произвольном порядке?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    https://devhints.io/bash
    Getting options
    while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in
      -V | --version )
        echo $version
        exit
        ;;
      -s | --string )
        shift; string=$1
        ;;
      -f | --flag )
        flag=1
        ;;
    esac; shift; done
    if [[ "$1" == '--' ]]; then shift; fi

    пример когда опции передаются в скрипт с параметром(-s | --string) и без(-V | --version и -f | --flag), правим под себя
    Ответ написан
    Комментировать
  • Можно ли вывести значение переменной http?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    x=$(awk -F'[ "]' '$1=="DocumentRoot"{print $3}' /etc/httpd/conf/httpd.conf)

    записали в переменную x нужное значение, а теперь выводим:
    $ echo $x
    /var/www/html
    Ответ написан
    Комментировать
  • Как клонировать систему со всеми пользователями и настройками на меньший по объёму диск?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    1. вставляете диск2
    2. подготавливаете диск2, создав и отформатировав разделы
    3. монтируете разделы диска2 к своей системе
    4. внимательно читаете это
    5. выставляете в rsync то что вам нужно и копируете данные с диск1 на диск2
    6. на диске2 правите fstab и чините свой загрузчик
    7. отключаете диск1 и запускаете систему с диска2

    можно проделывать из системы которую переносим и без бекапа (так как мы не трогаем основную систему и в случае чего можно просто загрузится с диска1)
    Ответ написан
    Комментировать
  • Как с помощью awk вставить # в строчку 647?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Как с помощью awk вставить # в строчку 647?

    вставить куда ? начало, конец, посередине ?
    если в начало, то:
    awk -i inplace 'NR==647{print "# "$0}NR!=647' a.txt

    где изменения мы пишем(-i inplace) прямо во входящий файл, в строку(NR) 647, добавляя перед всей строкой($0) решетку с пробелом("# "), при желании можно и без пробела("#"). Остальные строки(NR!=647) мы просто печатаем без изменений.
    Ответ написан
    Комментировать
  • Что будет, если постоянно держать температуру процессора без разгона на близких к критическим значениям (к примеру, 85-90 градусов при TJUNCTION 100)?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    в принципе допустимо, НО нужно не забывать что при эксплуатации - вентилятор постепенно забивается пылью, а термопаста сохнет и чем больше температура тем быстрее, то есть, через год ваши 85-90 могут превратится в 95-100.

    по поводу повреждений из за перегрева можно почитать что опишут в интел:
    Может ли процессор повредиться из-за перегрева?

    Маловероятно, что процессор будет поврежден из-за перегрева, поскольку в нем применяются соответствующие меры безопасности. Процессоры имеют два режима тепловой защиты, регулировки мощности и автоматического выключения. Когда ядро превышает установленную температуру для дросселирования, снижается мощность для поддержания безопасного уровня температуры. Предельные температуры могут отличаться для различных процессоров и настроек BIOS. Если процессор не может поддерживать безопасную рабочую температуру посредством дросселирования, он автоматически отключается, чтобы предотвратить необратимое повреждение.
    Ответ написан
    5 комментариев
  • Как сравнить значения в строках вывода и по условию выполнить скрипт?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    [[ $(sensors | awk '/Core/{i+=$3}END{print i/NR}') > 60 ]] && ./script.sh

    немного сократил ваш изначальный поиск температуры сделав всё через один awk + сделал через среднюю температуру всех ядер а не одного конкретного, думаю так будет правильнее.

    если вам всё же нужно не средняя а температура любого из ядер, то это довольно просто:
    [[ $(sensors | awk '/Core/{print $3}') > 60 ]] && ./script.sh

    при первом совпадении скрипт сработает
    Ответ написан
    Комментировать
  • Как с помощью цикла while, команды dig вывести в файл ips.txt A-записи домена, после чего на следующей строке PTR-запись IP?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    здесь можно обойтись и простым однострочником:
    dig +short vk.com |xargs -tI{} dig -x {} +short 2>&1|awk '/^dig /{print $3}!/^dig /'
    Ответ написан
    2 комментария
  • Как сделать возможным вывод программы в консоль?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    если нужно в динамике - одновременно выводить на консоль, писать в файл и тут же сразу построчно анализировать поступающую информацию, то тут чуть сложнее, хоть и не немного, вот небольшой пример:
    работа через файл
    #!/usr/bin/env bash
    
    # функции бот1 и бот2 которые постоянно выводят рандомно числа от 0 до 9 с интервалом в 2 секунды
    bot1(){
    	while true; do
    		echo "Bot1: $[RANDOM%10]"
    		sleep 2
    	done
    }
    
    bot2(){
    	while true; do
    		echo "Bot2: $[RANDOM%10]"
    		sleep 2
    	done
    }
    
    # путь к лог-файлу куда будем писать логи от ботов
    LOG=/tmp/botsLog.txt
    
    # удаляем лог-файл (если ненужно то закоментирвоать)
    rm -rf $LOG
    
    # запускаем ботов в фоновом(&) режиме, 
    # а также начинаем выводит поступающую от них информацию на консоль и писать в общий лог-файл
    bot1 | tee -a $LOG &
    sleep 1
    bot2 | tee -a $LOG &
    
    # функция анализа лог-файла (потока)
    analysisLogs() {
    	# запускаем постоянное построчное чтение поступающих данных в функцию
    	while read -r data; do
    		# здесь мы задаём фильтры и то что выполнить если совпадёт условие
    		case "$data" in
    			"Bot1: 0" ) echo "Бот 1 выдал ноль"
    				;;
    			"Bot2: 0" ) echo "Бот 2 выдал ноль"
    				;;
    		esac
    	done
    }
    
    # tail выводит поступающие данные по мере роста лог-файла (мониторит)
    # в данном случае мы передаём появляющиеся данные из файла в функцию analysisLogs
    tail -f $LOG | analysisLogs 
    
    # это необходимо чтобы главная программа преждевременно не завершилась 
    # пока не завершаться запущенные в ней фоновые(&) потоки
    wait
    
    exit

    с комментариями думаю будет понятней
    ctrl+c завершить скрипт

    можно конечно и через переменную сделать но это будет не так красиво да и не по феншую, кстати здесь мы пишем в ОЗУ так как /tmp у большинства дистрибутивов примонтирован в оперативной памяти.

    Если же не хочется вообще писать данные на диск или в озу, так как логи обычно склонны к накоплению если их не чистить да или просто ненужны, то можно просто использовать именованный канал(FIFO-файлы) с которым можно работать как с файлом(читать/писать) но при этом он будет выступать просто в роли промежуточного буфера, для этого в нашей программе нужно поменять всего две строчки(создать именованный канал и вместо tail использовать обычный cat )
    работа через fifo-файл
    #!/usr/bin/env bash
    
    # бот1 и бот2 просто постоянно выводят рандомно числа от 0 до 9 с интервалом в 2 секунды
    bot1(){
    	while true; do
    		echo "Bot1: $[RANDOM%10]"
    		sleep 2
    	done
    }
    
    bot2(){
    	while true; do
    		echo "Bot2: $[RANDOM%10]"
    		sleep 2
    	done
    }
    
    # путь к лог-файлу куда будем писать логи от ботов
    LOG=/tmp/botsLog.txt
    
    # удаляем лог-файл
    rm -rf $LOG
    
    # создаём именованный канал (FIFO-файл)
    mkfifo $LOG
    
    # запускаем ботов в фоновом(&) режиме, 
    # а также начинаем выводит поступающую от них информацию на консоль и писать в общий fifo-файл
    bot1 | tee -a $LOG &
    sleep 1
    bot2 | tee -a $LOG &
    
    # функция анализа поступающих данных
    analysisLogs() {
    	# запускаем постоянное построчное чтение поступающих данных в функцию
    	while read -r data; do
    		# здесь мы задаём фильтры и то что выполнить если сработает условие
    		case "$data" in
    			"Bot1: 0" ) echo "Бот 1 выдал ноль"
    				;;
    			"Bot2: 0" ) echo "Бот 2 выдал ноль"
    				;;
    		esac
    	done
    }
    
    # читаем файл(FIFO-файл) и передаём появляющиеся данные в функцию analysisLogs
    cat $LOG | analysisLogs 
    
    # это необходимо чтобы главная программа преждевременно не завершилась 
    # пока не завершаться запущенные в ней фоновые(&) потоки
    wait
    
    exit
    Ответ написан
    1 комментарий
  • Почему VScode не видит node.js на линукс?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    При попытке запустить код через VScode, вылазит ошибка, молв не может найти путь к node.

    вы что-то не то делаете, может вы ноду по какому-то специфическому пути поставили и в PATH путь не прописали, хотя если делать по стандарту всё должно завестись из коробки.

    $ sudo pacman -S node
    $ whereis node
    node: /usr/bin/node /usr/include/node /usr/share/man/man1/node.1.gz


    ссылки по теме:
    archwiki Node.js
    vscode integrated terminal
    Node.js tutorial in Visual Studio Code
    Ответ написан
    Комментировать
  • Как и куда bash убирает элемент массива?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    в простом случае:
    $ x='test1 test2'
    $ y=($x)
    $ echo ${y[0]} И ${y[1]}
    test1 И test2


    если же, например, у нас разделитель перевод строки то:
    $ x='test 1
    test 2'
    $ q="$IFS";IFS=$'\n';y=($x);IFS="$q"
    $ echo ${y[0]} И ${y[1]}
    test 1 И test 2
    Ответ написан
  • Как попасть в папку загрузок через консоль?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Как оказалось,папка пользователя зашифрована

    откуда такие выводы ?
    вы ввели команду shell и попали в домашний каталог текущего пользователя chronos
    для справки:
    cd $HOME
    также должен перенести в папку текущего пользователя
    знак "~" также указывает на домашнюю директорию пользователся

    в последнем скриншоте после команды ls как раз и выводится содержимое домашней папки пользователя и как видно там есть папка Downloads, вот в неё и переходите раз вам нужно попасть в папку загрузок через консоль
    cd Downloads
    ну или из любого места
    cd $HOME/Downloads
    аналог:
    cd ~/Downloads
    Ответ написан
    7 комментариев
  • Unix time VS Epoch time?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    ничем, это одно и тоже
    из вики:
    Unix time (also known as Epoch time, Posix time, seconds since the Epoch, or UNIX Epoch time) is a system for describing a point in time. It is the number of seconds that have elapsed since the Unix epoch, minus leap seconds; the Unix epoch is 00:00:00 UTC on 1 January 1970 (an arbitrary date); it is nonlinear with a leap second having the same Unix time as the second before it, and every day is treated as if it contains exactly 86400 seconds. Due to this treatment Unix time is not a true representation of UTC.
    Ответ написан
    Комментировать
  • Как присвоить значение элемента строкового массива в bash?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    можно загнать строки из файла в массив намного проще:
    x="$IFS";IFS=$'\n';array=(`cat array.list`);IFS="$x"


    если брать конкретно ваш вариант то можно использовать опцию lastpipe чтобы выполнить последнюю команду конвейера в текущей оболочке:
    i=1
    shopt -s lastpipe
    cat array.list | while read str
    do
       array["$i"]="$str"
       i=$(($i+1))
    done
    shopt -u lastpipe
    echo ${array[@]}
    Ответ написан
    Комментировать
  • Как брать инфу по id с кинопоиска?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    но не получается получить список актёров,режиссёра и кол-во серий. Подскажите, что я делаю не так?
    во первых укажите используемый язык в тегах к вопросу, во вторых дублирование своего вопроса(уже третий) плохой тон и обычно карается модераторами, в третьих всю необходимую информацию можно посмотреть в документации

    ради интереса сделал себе скрипт для вывода информации на консоль
    может кому еще сгодится
    #!/usr/bin/env bash
    set -o errexit
    
    BASE_URL="https://kinopoiskapiunofficial.tech/api"
    API_KEY="05e15730-5d36-4a7b-9cb8-1a9034ed276c"
    KEYWORD=$(echo "$@" | jq -Rr '@uri')
    
    # получаем список фильмов по ключевому слову
    get_keyword=$(curl -s -X GET "$BASE_URL/v2.1/films/search-by-keyword?keyword=$KEYWORD&page=1" -H "accept: application/json" -H "X-API-KEY: $API_KEY")
    
    # запоминаем id выбранного фильма
    FilmID=$(echo "$get_keyword" | jq -r '.films[] | "\(.filmId);\(.year);\(.nameRu);\(.nameEn)"' | column -t -s';' | sk | awk '{print $1}')
    [[ "$FilmID" == "" ]] && exit
    
    
    # получаем данные о фильме по его id
    get_film_data=$(curl -s	-X GET "$BASE_URL/v2.1/films/$FilmID" -H "accept: application/json" -H "X-API-KEY: $API_KEY")
    
    echo
    echo "$get_film_data" | jq -r '.data | "\t*** \(.nameRu) (\(.year)) ***"'
    echo "$get_film_data" | jq -r '.data | "\t    [ \(.nameEn) ]"'
    echo
    echo
    echo "             О фильме"
    echo =====================================================
    x="Год производства;"$(echo "$get_film_data" | jq -r '.data.year')
    x=$x"\nСтрана;"$(      echo "$get_film_data" | jq -r '.data.countries[].country' | sed -z 's/\n/, /g' | sed 's/..$//')
    x=$x"\nЖанр;"$(        echo "$get_film_data" | jq -r '.data.genres[].genre' | sed -z 's/\n/, /g' | sed 's/..$//')
    x=$x"\nВремя;"$(       echo "$get_film_data" | jq -r '.data.filmLength' | awk -F: '{print $1*60+$2" минут / "$0}')
    echo -e "$x" | column -t -s';'
    echo
    echo
    echo
    
    
    echo "             Описание"
    echo =====================================================
    echo "$get_film_data" | jq -r '.data.description' | par -w 60d
    echo
    echo
    echo
    
    
    echo "             Эпизоды"
    echo =====================================================
    echo "$get_film_data" | jq -r '.data.seasons[].episodes[] | "\(.seasonNumber);\(.episodeNumber);\(.nameRu);\(.nameEn)"' | column -t -s';'
    echo
    echo
    echo
    
    
    # получаем информацию о людях работавших над фильмом
    get_staff=$(curl -s	-X GET "$BASE_URL/v1/staff?filmId=$FilmID" -H "accept: application/json" -H "X-API-KEY: $API_KEY")
    
    
    echo "             Над фильмом работали"
    echo =====================================================
    echo "$get_staff" | jq -r '.[] | "\(.professionText);\(.nameRu);\(.nameEn)"' | column -t -s';'
    echo
    echo
    echo
    
    exit

    для запуска нужно передать в скрипт ключевое слово(фразу) по которой с сервера будет запрошена информация по совпадающим фильмам, после чего выдаст список в котором клавишами(верх, низ) выбираем нужный фильм.
    При выборе фильма с сервера автоматом запросится его id и выдаст структурированную информацию по фильму, его описанию, эпизодах и актёрах
    для работы помимо bash необходимы утилиты curl, skim, jq, par.
    Ответ написан
  • Можно ли подставить имя файла из ls?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    не совсем понятна задача
    не можете скопировать мышкой и не работает автодополнение ?
    узнаём номер нужной строки:
    ls -A1 | nl'
    если нужны только видимые(без точки в начале имени) файлы то можно упустить ключ A
    выводим строку по её номеру:
    ls -A1 | awk 'NR==7'
    где 7 это пример номера строки с нужным именем файла выданный с помощью команды ls, ставим свой номер.
    при желании можно завернуть это в переменную и просто вставлять где нужно:
    f=$(ls -A1 | awk 'NR==7')
    далее уже можно будет оперировать этой переменной, например:
    rm "$f"

    п.с.
    если нужно больше интерактива то можно воспользоваться утилитой skim(sk) или fzf
    f=$(ls | fzf)
    для скрытых файлов добавить ключ -A
    даст возможность выбрать нужный файл клавишами(верх, низ), а затем(Enter) передать его в переменную.
    ну а дальше уже оперируем переменной f
    Ответ написан
    Комментировать
  • Резервное копирование и восстановление etx4 возможно только в посекторном режиме?

    xotkot
    @xotkot
    хорошо есть и хорошо весьма
    Статься на Хабре прям для вас: Копирование разделов жёсткого диска средствами GNU/Linux: как обойтись загрузочной флешкой там, где раньше нужен был Акронис.
    Ответ написан
    Комментировать