Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения

Linux: как рекурсивно заменить пробелы в названии файлов и директорий

Файлы с пробелами в имени иногда неудобно обрабатывать в скриптах, поэтому я стараюсь их не использовать. Но если есть директория, в которой находятся файлы с пробелами в именах, и хочется их все переименовать так, чтобы вместо пробелов использовались, например, символы подчеркивания, то в Linux это легко сделать с помощью утилиты find:
find /path_to_dir/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
Флаг -depth указывает утилите, что сначала надо обрабатывать содержимое текущей директории, а только потом саму директорию (что позволяет нам сначала переимновать все файлы внутри директории и только потом ее саму); флаг -execdir позволяет выполнить слудующую за ним команду из текущей директории; rename - утилита, установленная в Ubuntu по умолчанию. В итоге find ищет в заданной директории все файлы и поддиректории с пробелами в именах, а rename - заменяет пробелы на подчеркивания.

Как открыть несколько соединений Tor для использования в Python скриптах (на примере Ubuntu)

В предыдущем посте я показал, как можно использовать соединение Tor из Python-скрипта (а также как устанавливать и запускать Tor-сервис в Ubuntu). Преимущество того подхода (по сравнению с использованию Privoxy в качестве прослойки мeжду SOCKS и HTTP) заключается в том, что он легко масштабируется: можно открыть любое (на сколько хватит аппаратных ресурсов) количество соединений и каждому Python процессу дать по одному прокси-порту (c Privoxy это тоже можно сделать, но несколько сложнее).
Здесь же я проведу в качестве примера Bash-скрипт, который открывает заданное количество Tor-соединений и для каждого соединения запускает два Python-скрипта.

Python3: как выполнять HTTP запросы через Tor (на примере Ubuntu)

В этом посте я опишу как пользоваться Tor в своих Python-скриптах. Зачем это нужно? Например, чтобы изменить свой видимый IP адрес для сервиса, к которому вы обращаетесь.
Нам понадобится установленный Tor и Python (я использую третий, но второй, по идее, тоже должен работать). Многие советуют использовать дополнительный сервис Privoxy между Tor, который работает как SOCKS-прокси и библиотеками Python, которые хотят получить HTTP-прокси, но я не очень понял, зачем, если в Python можно пользоваться SOCKS-прокси напрямую.
У меня установлена Ubuntu, поэтому и весь процесс я описываю для этой ОС. В других, я так понимаю, все должно быть примерно так же (Python-код должен работать в любом случае, разница может быть только с установкой и запуском Tor).

Linux: stress - утилита для организации нагрузки на систему

Stress - полезная утилита для Linux, которая позволяет организовать различные типы нагрузок на систему.
Пример использования:
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

Перенаправить вывод tail -f через grep в файл

Команда
tail -f log.txt | grep "expression"
позволяет, например, фильтровать лог выполняющейся программы. Однако, чтобы перенаправить ее вывод в файл, нужно вызывать grep с флагом --line-buffered. В этом случае grep будет писать в файл не при заполнении буфера, а при получении символа новой строки.
В итоге команда должна выглядеть так:
tail -f log.txt | grep --line-buffered "expression" >> file.txt

Создание и установка разделяемых библиотек (shared libraries) в Linux

Как собрать код в разделяемую библиотеку с помощью gcc

gcc -fPIC -c helloworld.c -o helloworld.o
gcc -shared -Wl,-soname,libhelloworld.so.1 -o libhelloworld.so.1.0.1 helloworld.o
Первая команда компилирует исходник helloworld.c в объектный файл helloworld.o, вторая - создает из объектного файла разделяемую библиотеку helloworld.so.1.0.1.

Linux: запуск программы на одном процессоре

В многопроцессорных системах иногда полезно в целях отладки (или, например, измерения производительности) запускать программу только на одном процессоре. Это можно сделать в Linux с помощью команды:
taskset -c 0 ./program_name
Это команда запускает процесс с заданным свойством CPU affinity; оно, в свою очередь, определяет список процессоров, на которых планировщик может запускать данный процесс. В данном примере оно позволяет планировщику запускать заданный процесс только на ядре номер 0. Можно также указать несколько номеров через запятую.

Одновременное отображение вывода программы в терминале и запись его в файл

Чтобы и увидеть вывод программы в терминале и записать его в файл, можно воспользоваться командой tee:
program | tee filename.log

Linux: Получение количества потоков в процессоре в командной строке

Чтобы узнать количество потоков, которые процессор может одновременно выполнять, можно выполнить команду:
cat /proc/cpuinfo | grep processor | wc -l
Выводится сожержимое файла /proc/cpuinfo, из него берутся строчки, содержащие слово "processor", а команда "wc -l" считает количество поданных ей на вход строчек. Вывод этой команды, например, удобно передавать в make для параллельной сборки:
make -j 'cat /proc/cpuinfo | grep processor | wc -l'
UPD: более короткая весрия той же команды:
grep processor /proc/cpuinfo | wc -l

Linux: команды командной строки для просмотра размера директорий

Команда:
ls -l
не дает размера директории. Чтобы узнать его, можно воспользоваться командой:
du -hs /path-to-directory
-h дает размеры в "human readable" виде,
-s - summary, без нее команда du выдаст не только размер заданной директории, но также и размеры всего, что в ней находится.
Команда:
du -h --max-depth=1 /path-to-directory
Выдаст размеры всех поддиректорий в заданной директории. Ну и для просмотра занятого и свободного места на диске можно воспользоваться командой: df

Linux: cложить все числа в файле в командной строке

В предыдущем посте было написано, как выбрать все числа из файла. В итоге у меня получился в файл в каждой строке которого находится число. Эти числа можно обработать с помощью awk. Например, очень легко можно сложить все числа:
awk '{s+=$1} END {print s}' filename

Linux: вывод в консоль всех чисел из файла

Для выборки всех чисел из файла воспользуемся утилитой grep:
grep -o "[0-9]" filename
[0-9] - регулярное выражение, в которое попадают только цифры от 0 до 9. Флаг -о заставляет grep выводить не всю найденную строку, а только то, что задано регулярным выражением. Проблема в том, что таким образом grep выведет все цифры, нам же нужны все числа. Нужно дописать регулярное выражение:
grep -oE "[0-9]{1,}" filename
Флаг -Е разрешает расширенные регулярные выражения (extended regexp), а {1,} определяет длину предыдущего выражения. В нашем случае, будут найдены все последовательности из цифр длиной от одного символа и больше, то есть все числа. Можно также ограничить максимальную длину числа (например, не больше 5 цифр), указав верхнюю границу в выражении:
grep -oE "[0-9]{1,5}" filename
В следующем посте пример того, как обработать полученный вывод.

Linux: вывод в консоль заданных строк из файла

Чтобы вывести в консоль только строки, заданные определенным регулярным выражением, достаточно выполнить команду:
sed -n '/regexp/p' filename
Без опции -n sed выведет помимо заданных строк все строки файла, на место regexp надо подставить регулярное выражение, на место filename - имя файла, /p - это имя команды sed.
Строки можно также выводить по вхождению подстроки:
sed -n '/some_words/p' filename
по номеру:
sed -n '5p' filename
и по диапазону номеров:
sed -n '5,9p' filename
Диапазон также можно задавать двумя подстроками или двумя регулярными выражениями:
sed -n -e '/some_words_1/,/some_words_2/p' filename
sed -n -e '/regexp1/,/regexp2/p' filename
Также можно вывести строки, начиная от заданной и до конца файла:
sed -n '/regexp/,$p' filename

Linux: перенаправление потоков stderr и stdout в файл

Перенаправить одновременно stderr и stdout в файл можно так:
program > log_file 2>&1
или, чтобы не перезаписывать каждый раз файл, а добавлять в конец, соответственно:
bash_command >> log_file 2>&1
Что значит выражение: 2>&1:
2 - это дескриптор потока stderr;
&1 - это дескриптор потока stdout (амперсант перед 1 означает, что 1 - это не имя файла, а именно дескриптор);
то есть мы перенаправляем stderr туда же, куда перенаправлен к этому моменту stdout. Поэтому сначала перенаправляем stdout в файл (посредством > log_file), а затем перенаправляем туда же stderr. Например, следующая команда:
program > err_file 2>&1 > log_file
Перенаправит stderr туда, куда был к этому моменту перенаправлен stdout (в файл err_file), а потом перенаправит stdout в log_file. Другой способ перенаправить stderr и stdout в разные файлы:
program > log_file 2> err_file

Linux: yстановить права доступа для файлов и поддиректорий в командной строке

Изменить права доступа для всех поддиректорий на 755 (-rwxr-xr-x):
find /path -type d -exec chmod 755 {} \;
Изменить права доступа для всех файлов на 644 (-rw-r--r--):
find /path -type f -exec chmod 644 {} \;

Linux: найти все файлы, измененные за определенный период времени

Найти файлы в текущей директории, измененные 28 октября 2014 года
find . -newermt "2014-10-28 00:00:00" ! -newermt "2014-10-29 00:00:00"

Потоковое вещание видео с камеры с помощью GStreamer и HTML5. Часть 2: код на Си++

В прошлом посте я передал картинку с камеры на html-страницу с помощью html-тега <video> и утилиты gst-launch, которая поставляется вместе с GStreamer. Однако gst-launch не очень удобно интегировать в свои программы, поэтому я написал на Си++ свой плеер на GStreamer, который использует тот же пайплайн (то есть берет картинку из /dev/video и передает на tcp порт).

Автоматическое построение зависимостей в make

Проблема в том что make сам не умеет строить зависимости файлов с исходными кодами от заголовочных файлов. То есть, например, строим бинарный файл из foo.cpp, в который, с помощью директивы include включен bar.h. Простейший makefile будет выглядить как-то так:
all: test

test: foo.cpp
    g++ foo.cpp -o test
Включаемый файл bar.h нигде не упоминается, и если мы его изменим, цель пересобрана не будет. Чтобы этого не происходило, надо указать bar.h в зависимостях рядом с foo.cpp. Однако вручную перечислять в зависимостях все включаемые заголовочные файлы практически нереально.

Linux: заменить символы '<', '>' и '&' на соответствующие html коды в командной строке

Когда вставляю сюда код, указанные символы часто заменяются неправильно на соответствующие html-коды ('&lt;', '&gt;' и '&amp;' соответственно). В Linux произвести эту замену самому перед вставкой проще всего мне показалось используя sed:
sed 's/\&/\&amp;/g;s/</\&lt;/g;s/>/\&gt;/g' inputFileName.cpp
Команда s/ в sed заменяет одну подстроку на другую. Отдельные команды в sed разделяются симоволом точки с запятой, соответственно, здесь три команды замены. Формат команды s/ такой:
sed 's/regexp/replacement/g' inputFileName
/g означает "заменить все вхождения в файле". Ну и символ & приходится экранировать, так как он используется в регулярных выражениях.

Вычислениe времени выполнения участка кода на Си/C++. Часть 2: функция clock_gettime

Некоторое время назад мне понадобилось измерить время работы одного алгоритма, и я нашел быстрое решение для этого: Вычислениe времени выполнения участка кода на Си/C++. Дальнейшее исследование показало, что способ этот отнюдь не идеален.