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

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

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

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

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

Ubuntu: первоначальная настройка Raspberry Pi без монитора

Самый простой способ запустить и настроить Raspberry Pi - подключить к ней монитор и клавиатуру, вставить SD карту на которую скопирован установщик NOOBS, и включить. Если же лишнего монитора нет, то можно по-прежнему установить самостоятельно установить Raspbian на SD карту, запустить с этой карты Raspberry Pi, подключиться по ssh (включен по умолчанию) и настроить удаленный рабочий стол. Для этого понадобится только компьютер с Ubuntu (просто потому, что у меня Ubuntu - для других дистрибутивов, Windows и OS X процесс не должен принципиально отличаться), сеть ( и возможность подключиться к ней с помощью Ethernet кабеля), чистая SD карта размером больше, чем образ Raspbian (Raspbian Jessie занимает 4 Гб) и сама Raspberry. Ниже приведена пошаговая инструкция, что надо сделать, чтобы все заработало.

Ubuntu: изменение кодировки id3v2 тегов для всех файлов в папке

Некоторые проигрыватели понимают только Unicode кодировки в id3 тегах. В итоге, если файл, созданный в Windows, содержит теги с кириллицей, то в проигрыватель может показать что-то такое: Ãðàæäàíñêàÿ îáîðîíà.
К счастью, кодировка UTF-8 воспринимается всеми, поэтому ее легко можно использовать вместо любой другой. А переконвертировать теги для всех mp3 файлов в папке в Ubuntu можно следующим образом.
  1. Устанавливаем пакет python-mutagen:
    sudo apt-get install python-mutagen
    
  2. Определяем, в какой кодировке записаны нечитаемые теги: 
    • вот так можно получить список возможных кодировок:
      iconv --list
      
    • копируем нечитаемую строчку в декодер и смотрим, что он скажет,
    • или смотрим на диаграмму.
  3. Проверяем, правильно ли мы определили кодировку: 
    • выполняем команду:
      mid3iconv -p -d -e <source-encoding> input.mp3
      
      где source-encoding - это полученная ранее кодировка, input.mp3 - mp3 файл с нечитаемыми тегами; флаг -p выставляется, чтобы команда не изменяла сам файл, но просто вывела в консоль конвертированные значения тегов;
    • если в консоли появляются читаемые теги - переходим к следующему шагу, если нет - значит, исходная кодировка выбрана неправильно.
  4. Конвертируем все файлы с расширением .mp3 в папке (и рекурсивно во внутренних папках) из заданной кодировки в UTF-8:
    find . -name "*mp3" -print0 | xargs -0 mid3iconv -e <source-encoding> -d 
    
    или для примера выше (файлы, записанные в Windows c кириллицей в тегах часто имеют кодировка CP1251):
    find . -name "*mp3" -print0 | xargs -0 mid3iconv -e CP1251 -d
    

Как определить ip-адрес устройства в локальной сети в командной строке

Иногда полезно получить список ip-адресов всех устройств в подсети или в диапазоне адресов (например, чтобы подключиться по ssh к устройству, у которого нет монитора). Для этого отлично подойдет утилита nmap (распостраняется и для Linux  и для Windows, для Ubuntu она есть в репозиториях).
Вот как это можно сделать по маске подсети:
nmap -sn 192.168.1.0/24
Эта команда просканирует все 256 адресов в подсети 192.168.1 без сканирования портов, вернет список текущих активных устройств с их именами и ip-адресами.
Вот так можно получить список всех устройств с открытым 22-м портом (по умолчанию используется для ssh) в той же подсети:
nmap -p 22 --open -sV 192.168.1.0/24
Вместо маски подсети можно использовать диапазон адерсов:
nmap -sn 192.168.1.*
просканирует все 256 адерсов, начинающихся с 192.168.1., а
nmap -sn 192.168.1.24-128
просканирует адреса с 192.168.1.24 по 192.168.1.128.

Ubuntu: Как проиграть Raw PCM аудио файл в командной строке Ubuntu 14.04

Чтобы проиграть аудио файл представляющий из себя сырые PCM данные (без заголовка) можно, например, воспользоваться командой:
mplayer -rawaudio samplesize=2:channels=2:rate=44100 -demuxer rawaudio test.raw
Она проиграет PCM стерео файл, по 2 байта на сэмпл, с частотой сэмплов 44100 Hz.
Ну а если не нужно играть в терминале, можно просто воспользоваться Audacity.

Tar: как разархивировать multipart-архив в командной строке

Разархивировать tar-архив, состоящий из множества частей, из командной строки можно с помощью следующей команды:
cat archive.tar.* | tar xvf -

Ubuntu 14.04: как удалить все старые ядра

При загрузке обновлений Ubuntu может жаловаться, что на диске /boot недостаточно свободного места. Скорее всего, это значит, что там хранятся старые версии ядра. Удалить их можно следующим образом:
сначала выясняем, какая версия ядра используется в данный момент, с помощью команды:
uname -r
Далее выводим список других установленных ядер:
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]'
и убеждаемся, что в этом списке нет используемого ядра.
Далее можно переправить вывод предыдущей команды на вход команды "sudo apt-get -y purge":
dpkg -l linux-{image,headers}-"[0-9]*" | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e '[0-9]' | xargs sudo apt-get -y purge
После этого все ядра из списка будут удалены.
Источник.

Git: как объединить все коммиты в один

Чтобы объединить все предыдущие коммиты в один (например, чтобы удалить всю историю), можно воспользоваться командой:
git rebase --root -i
После этого список всех коммитов откроется в текстовом редакторе, и напротив каждого из них, кроме первого, нужно будет заменить слово "pick" на "squash". Тогда все предыдущие коммиты будут включены в тот, который находится на первом месте в списке. Затем его можно отредактировать:
git commit --amend --author "Name <e-mail>" --date="$(date -R)" 
Но можно сделать это быстрее с помощью команды:
git reset $(git commit-tree HEAD^{tree} -m "commit message")
которая создаст новый коммит на основе всего существующего дерева.
В обоих случаях при публикации изменений необходимо добавлять опцию "-f":
git push -f

Ubuntu 14.04: разрешить сохранение core-файла

В Ubuntu 14.04 по умолчанию при падении приложения все сведения о нем перенаправляются в Apport (правила перенаправления находятся в этом файле: /proc/sys/kernel/core_pattern), которая собирает информацию о системе и генерирует отчет. Крэши пользовательских приложений она пропускает дальше в систему, но по умолчанию генерация core-файлов в системе запрещена. Включить ее можно выполнив команду:
ulimit -c 10000
где 10000 - это размер core-файла в блоках по 1кб. По умолчанию это число выставлено в 0. За сессию его можно изменить один раз, если нужно поменять еще раз - придется логиниться заново. Ну и логи Apport находятся по адресу: /var/log/apport.log. Там, например, будет сообщение об ошибке, если core-файл оказался большего размера, чем разрешено в ulimit -c. Если же значение ulimit -c не превышено, core-файл будет сгенерирован в той же директории, в которой находится упавшее приложение.

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

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