Не для кого не секрет, что некоторые типичные действия на компьютере проще быстрее и эффективнее выполнить из-под командной строки нежели мышкой в GUI explorer(e).
Поэтому в этом тексте я хотел бы поделиться командами, которые мне очень часто помогают в повседневной работе.

Unix(овые) утилиты для командной строки можно с легкость отрабатывать и на Windows, если установить GIT и открыть консоль GIT.

Также их можно установить из CygWin или MinGW.

Полезные команды в интерпретаторе Bash

24--На работе мне в мессенджер Junior программисты микроконтроллеров часто пишут личные сообщения типа:

В каком файле и папке лежит тело функции UsecToStr(...)?

Для этого есть очень простой шаблон на основе утилиты grep. Открываешь папку корня workspace репозитория и набираешь команду

grep -rn "UsecToStr(" | grep "\.c:"

Тут опция -r значит искать во всех папках, -n значит показывать в отчете номер строки на которой обнаружилась искомая подстрока. В общем, ступенчатый grep способен найти даже иголку в стоге сена!

Правда в том, что если у Вас локально на SSD/HDD диске есть Си-код и Вы знаете и умеете пользоваться утилитой grep, то Вам в принципе не нужна никакая другая документация для кода! Любую информацию Вы сможете извлечь при помощи grep запросов.

1--Показать абсолютный путь к утилите, например grep

where grep

2--Рекурсивно заменить слово old_word на new_word во всех файлах внутри директории.

grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g'

Тут для grep -r означает, что искать внутри папок рекурсивно, -l означает показывать только пути к файлам. Для sed -i означает, что замена слова будет произведена прямо в этом же файле (in place), s означает что надо заменить первый токен на второй токен, флаг g заменяет все вхождения заменяемого токена.

25--Во всех файлах в этой папке (включая вложенные папки с файлами) удалить все строки в которых есть ключевое слово KeyWord, начиная с данной директории

find . -type f -print0 | xargs -0 sed -i /KeyWord/d

Вообще с командой sed надо быть очень осторожным! Sed может тихо изменить там, где это не следует (например *.ewp настройки проекта в IAR), и потом не откроется проект в вашей любимой GUI-IDE. Как следствие Вы не сможете больше никогда собрать свой проект. И у Вас могут начаться из-за этого паника, судороги и конвульсии.

3--Показать размер папок

du -a --max-depth=1 | sort -n

4--Показать переменные окружения. Это очень частая команда для проверки системы перед сборкой.

env

5--Найти все файлы с расширением .bak

find . -type f -name "*.bak"

6--Удалить все файлы с расширением .bak

find . -type f -name "*.bak"   -delete

7--Открыть все *.mk файлы

for f in $(find . -name '*.mk' -not -name "sub"); do start Notepad++ $f; done

8--Удалить строку 35 из файла file.doti

sed -i '35d' file.doti

9--Найти все директории с именем Drivers в данной папке

find . -name 'Drivers' -type d

10--Найти *.с и *.mk файлы в локальном GIT репозитории

git status | grep -e "\.mk"  -e "\.[ch]" | grep -v "\.cmake" | grep -v "\.html"

11--Отсортировать процессы по потреблению RAM

tasklist | sort -k5

12--Узнать количество свободно места на диске

df -h

13--Показать размер папок

du -hs * | sort -hr

14--Установить переменную окружения

export var=some_value

15--Удалить папку со всем её содержимым.

rm -rf folder_to_delete

16--Отсортировать строки по конкретной колонке.

sort -nr -k6 -t'|' LoRaByteRatesTable.txt -o LoRaByteRatesTable_sorted.txt

17--Найти все файлы больше 10Mbyte.

find -type f -size +10M	

18--Поиск файла по расширению *.s.

find . -name '*.s'  	

19-- Команда, которая ищет во всех файлах проекта места с упоминанием ключевого слова "LED", причем только в файлах board.h

grep -rn LED | grep board.h

Это команда приведена только для примера, что через консоль можно делать поиск поверх предыдущего поиска. Так называемый многоступенчатый поиск. Встроенному поиску из-под GUI-IDE такое даже и не снилось.

20--Показать состояния TCP соединений.

 netstat -n -p TCP

Опция -n показать IP адрес и локальный порт, -p значит указать название протокола

21-- Автоматически отсортировать строчки в конфиг файле по алфавиту и еще при этом удалить повторения.

sort.exe -u config.mk -o config.mk

Мега полезная команда так как после нее образуется минимальный diff в утилите WinMerge. Эту команду вообще надо прописать в скрипты сборки кода.

22--Показать все файлы с расширением *.mk в git репозитории

git status | grep "\.mk"

Вообще консольный git и grep это не иначе как неразрывные друзья! Можно также найти все файлы любого другого расширения. Выбрать то, что вы хотите зафиксировать и сделать очень прицельный и аккуратный коммит.

23--Типичная ситуация. Вы делаете git pull и получаете вот такую картинку.

Проблема это сообщение

error: The following untracked working tree files would be overwritten by merge:

Для того чтобы загрузить изменения из удаленного репозитория и продолжить работу надо переименовать папку nrf5340_dk_nortos_max98357a_m. И естественно это можно сделать из командной строки. Грубо говоря, не отходя от кассы.

 mv source/projects/nrf5340_dk_nortos_max98357a_m/ source/projects/nrf5340_dk_nortos_max98357a_m_old7


И также надо переименовать файл flash_preconfig.mk из командной строки. Делает это команда mv

 mv source/mcal/mcal_common/flash/flash_preconfig.mk source/mcal/mcal_common/flash/flash_preconfig_old.mk

Далее уже имея две папки (локальная и от удаленного репозитория) можно сравнить две версии в культовой утилите WinMerge и выбрать лучшее из обоих версий файлов для сборки очередной прошивки.

23-- Иной раз надо целиком скопировать одну папку в другую папку без лишних вопросов о подтверждении действий. Для этого существует Windows утилита robocopy

robocopy dir/source_dir dir/destination_dir /S

Тут /S означает копировать поддиректории за исключением пустых директорий

Вывод

Как видите, использование командной строки позволяет снизить утомляемость от напряжения внимания и, как следствие, существенно повысить производительность работы за персональным компьютером PC.

Если Вы тоже знаете какие-либо простые элегантные и главное полезные консольные команды, то пишите их в комментариях. Не обязательно из bash можно и из cmd или вообще powershell. Лишь бы эли команды умещались в одну строку.

Links

https://cygwin.com/

Комментарии (29)


  1. HemulGM
    05.11.2023 12:48
    +10

    Вот команды bash, а вы в 80% описали отдельные утилиты, не связанные с bash

    Команды bash
    GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
    These shell commands are defined internally.  Type `help' to see this list.
    Type `help name' to find out more about the function `name'.
    Use `info bash' to find out more about the shell in general.
    Use `man -k' or `info' to find out more about commands not in this list.
    
    A star (*) next to a name means that the command is disabled.
    
     job_spec [&]                                                history [-c] [-d offset] [n] or history -anrw [filename]>
     (( expression ))                                            if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMAN>
     . filename [arguments]                                      jobs [-lnprs] [jobspec ...] or jobs -x command [args]
     :                                                           kill [-s sigspec | -n signum | -sigspec] pid | jobspec .>
     [ arg... ]                                                  let arg [arg ...]
     [[ expression ]]                                            local [option] name[=value] ...
     alias [-p] [name[=value] ... ]                              logout [n]
     bg [job_spec ...]                                           mapfile [-d delim] [-n count] [-O origin] [-s count] [-t>
     bind [-lpsvPSVX] [-m keymap] [-f filename] [-q name] [-u >  popd [-n] [+N | -N]
     break [n]                                                   printf [-v var] format [arguments]
     builtin [shell-builtin [arg ...]]                           pushd [-n] [+N | -N | dir]
     caller [expr]                                               pwd [-LP]
     case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esa>  read [-ers] [-a array] [-d delim] [-i text] [-n nchars] >
     cd [-L|[-P [-e]] [-@]] [dir]                                readarray [-d delim] [-n count] [-O origin] [-s count] [>
     command [-pVv] command [arg ...]                            readonly [-aAf] [name[=value] ...] or readonly -p
     compgen [-abcdefgjksuv] [-o option] [-A action] [-G globp>  return [n]
     complete [-abcdefgjksuv] [-pr] [-DEI] [-o option] [-A act>  select NAME [in WORDS ... ;] do COMMANDS; done
     compopt [-o|+o option] [-DEI] [name ...]                    set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
     continue [n]                                                shift [n]
     coproc [NAME] command [redirections]                        shopt [-pqsu] [-o] [optname ...]
     declare [-aAfFgilnrtux] [-p] [name[=value] ...]             source filename [arguments]
     dirs [-clpv] [+N] [-N]                                      suspend [-f]
     disown [-h] [-ar] [jobspec ... | pid ...]                   test [expr]
     echo [-neE] [arg ...]                                       time [-p] pipeline
     enable [-a] [-dnps] [-f filename] [name ...]                times
     eval [arg ...]                                              trap [-lp] [[arg] signal_spec ...]
     exec [-cl] [-a name] [command [arguments ...]] [redirecti>  true
     exit [n]                                                    type [-afptP] name [name ...]
     export [-fn] [name[=value] ...] or export -p                typeset [-aAfFgilnrtux] [-p] name[=value] ...
     false                                                       ulimit [-SHabcdefiklmnpqrstuvxPT] [limit]
     fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [c>  umask [-p] [-S] [mode]
     fg [job_spec]                                               unalias [-a] name [name ...]
     for NAME [in WORDS ... ] ; do COMMANDS; done                unset [-f] [-v] [-n] [name ...]
     for (( exp1; exp2; exp3 )); do COMMANDS; done               until COMMANDS; do COMMANDS; done
     function name { COMMANDS ; } or name () { COMMANDS ; }      variables - Names and meanings of some shell variables
     getopts optstring name [arg]                                wait [-fn] [id ...]
     hash [-lr] [-p pathname] [-dt] [name ...]                   while COMMANDS; do COMMANDS; done
     help [-dms] [pattern ...]                                   { COMMANDS ; }


  1. lair
    05.11.2023 12:48
    +8

    В хабе "разработка под Windows" я бы все-таки не ожидал видеть инструкцию по применению утилит из *nix - учитывая, что в Windows есть PowerShell.


    1. mc2
      05.11.2023 12:48
      +1

      :) автор devops


    1. aabzel Автор
      05.11.2023 12:48

      PowerShell очень медленно работает.
      Утилиты из СygWin делают то же в 3 раза быстрее.


      1. lair
        05.11.2023 12:48
        +7

        (а) мне хватает скорости PowerShell
        (б) я не хочу (а иногда - не могу) ставить cygwin


        1. igorts
          05.11.2023 12:48
          -1

          для Windows powershell отличный инструмент, единственное заметное неудобство - отличается набор команд в разных версиях , приходится при написании ориентироваться на 3 версию


        1. aabzel Автор
          05.11.2023 12:48
          -2

          мне хватает скорости PowerShell

          Что-то народ не особо ратует за PowerShell. Не подскажете почему?




          1. lair
            05.11.2023 12:48
            +1

            Понятия не имею. Подозреваю, что зависит от выборки, на которой вы собирали данные.


  1. crawlingroof
    05.11.2023 12:48
    +1

    du -lhs `ls`
    оч помогает искать место на чистой системе, статья должна быть докторская конечно.
    cygwin в windows очень помогает


  1. iig
    05.11.2023 12:48
    +2

    Полезные Утилиты Командной Строки Bash

    Все команды bash по своему полезны, да.
    И утилиты из coreutils тоже, даа..


  1. bzq
    05.11.2023 12:48

    Есть ошибки. И заголовок неточный.


  1. saboteur_kiev
    05.11.2023 12:48
    +9

    Очень очень плохая статья.
    Для начала автор путается в терминологии. Путает консоль гит и консоль гит-баш, путает баш и шелл, путаете сложность команд, путаете bash и gnu tools...

    Не нужно писать статью, если вы просто решили поделиться полезными командами из своего персонального читщита, но не владеете материалом. Тем более что подобных базовых примеров много не только в инете но и на Хабре.


    1. kekoz
      05.11.2023 12:48
      -5

      Как можно путать баш и шелл, если bash и есть shell (один из многих)?

      А ещё интересно будет послушать про “консоль гит и консоль гит-баш”...


      1. DirectoriX
        05.11.2023 12:48
        +5

        Как можно путать баш и шелл, если bash и есть shell (один из многих)?

        А так, что есть оригинальный sh (который и есть shell), и есть множество потомков-наследников: bash, dash, fish, zsh, и так далее. У них у всех свои собственные фишечки, делающие их не очень совместимыми друг с другом, чего только стоит разное поведение echo в отдельных сценариях.

        “консоль гит и консоль гит-баш”.

        Git for Windows создаёт ярлык и для Git Bash, и для Git CMD. Они оба откроют консоль, но очень разную.


        1. ALexhha
          05.11.2023 12:48
          +1

          А так, что есть оригинальный sh (который и есть shell), и есть множество потомков-наследников: bash, dash, fish, zsh, и так далее.

          Ну и я часто получал вопрос вида - "What shell do you prefer ?" И всегда было понятно о чем речь, при этом я никогда не душнил типа - не shell, а linux command shell )))

          Из этой же серии - "Какой линукс ты используешь ?" Формально вопрос не совсем корректный, но все все понимают

          P.S.

          А еще есть переменная окружения SHELL


          1. saboteur_kiev
            05.11.2023 12:48
            +1

            И всегда было понятно о чем речь

            но консоль гит и линукс шелл это настолько разные вещи, что в данном случае следует уточнять, когда автор статьи утверждает про консоль гит (а не гит-баш).

            Переменная окружения SHELL в данном случае не про то вообще. Мы говорим про разницу в терминах между shell и git.
            Ведь cmd.exe тоже shell. И explorer.exe тоже shell.


        1. kekoz
          05.11.2023 12:48
          -2

          А так, что есть оригинальный sh (который и есть shell), и есть множество потомков-наследников:

          Спасибо, конечно, но на 4-м десятке лет работы с Unix я это знаю чуть более, чем хорошо. А теперь попробуйте рассказать мне, чем будут отличаться способы запуска и результаты исполнения любых из приведённых автором команд?

          Видите ли, “bourne again shell” или “z shell” не перестали быть shell'ами из-за своих названий. Более того, все перечисленные вами shell'ы — одного поля ягоды, все выросли из bourne shell. И автор статьи не привел ни одного примера откровенного “башизма”, все его примеры будут одинаково работать во всех bourne-shell-наследованных шеллах, поэтому задам вопрос ещё раз — как можно путать shell и shell? А ещё лучше — покажите, где именно автор этой статьи (да, убогой, тут даже спорить не о чем) “путает баш и шелл” (в чём его обвинил автор изначального комментария ветки)?

          Git for Windows создаёт ярлык и для Git Bash, и для Git CMD. Они оба откроют консоль, но очень разную.

          Прежде, чем писать такое, следовало бы хоть минимально исследовать вопрос.

          До установки Windows Terminal (в составе которого есть Open Console), в Windows была и есть одна единственная “консоль” — ранее conemu.exe, ныне conhost.exe. Я не просто так беру в кавычки, поскольку функционально это никакая не консоль, а весьма убогий эмулятор терминала, который способен лишь рендерить символы да интерпретировать довольно скромный набор управляющих последовательностей. От него, собственно, большего и не требуется. И какой бы “ярлык” Git for Windows ты ни выбрал — хоть Git bash, хоть Git CMD — та самая пресловутая “консоль” у этих окошек будет одна и та же. А вот что в них будет действительно “очень разным”, так это интерпретатор команд, взаимодействующий с пользователем. Так называемый шелл, ага. Только в одном случае он будет mingw-сборкой GNU bash, а в другом — убогий родной виндовый cmd.exe. Но “консоль” — та же самая, независимо от выбора “ярлыка”. Да, и на работу собственно Git это не влияет примерно никак.

          Но мой вопрос — чем же всё таки отличаются “консоль гит” (и что это вообще такое?) и “консоль гит-баш” — ответа я так и не получил. Но я, признаться, не особо и претендую.


          1. saboteur_kiev
            05.11.2023 12:48
            +1

            Установите гит для винды.
            Запустите git-bash.exe и git-cmd.exe
            Выполните команду help в каждой из них

            Скажите - вы не видите разницы?

            До установки Windows Terminal (в составе которого есть Open Console), в Windows была и есть одна единственная “консоль” — ранее conemu.exe, ныне conhost.exe

            С каких пор conemu (conemu.github.io опенсорс проект) внезапно превратился в ms conhost.exe?

            Как и автор, вы таки путаете термины консоль и терминал.

            Консоль это консоль управления.
            Поэтому ярлыки, которые ведут к git-bash и git-cmd отличаются тем, что они ведут к разным консолям управления. Ввтор статьи в этом не разбирается, называя git-cmd консолью гита. В этом и смысл, что git-cmd не относится к linux shell/bash никак.

            Еще неопытных пользователей может сильно смущать что в PATH в обоих случаях попадают gnu утилиты, которые могут продолжать работать в обеих консолях. И те, кто не понимает разницы между linux shell и gnu tools тоже могут запутаться.


        1. nronnie
          05.11.2023 12:48
          +1

          Я всегда ставлю модуль Posh-Git и с ним замечательно работается в git прямо из обычного PowerShell без всяких git-bash(cmd)


          1. saboteur_kiev
            05.11.2023 12:48
            +1

            С гит и так работается из powershell. Posh-Git просто добавляет удобства автокомплитом и форматированием.

            Но под капотом гит все равно юзает gnu утилиты именно тем способом, который принят в linux shell, а не в повершелле


  1. dskonev
    05.11.2023 12:48
    -2

    А я не душнила. Сохраню в закладках и буду пользоваться по необходимости. Если это работает, то мне не важно, как это называется. Спасибо, автор!


    1. saboteur_kiev
      05.11.2023 12:48

      Раньше был такой шутливый вопрос: чем отличается чайник и ламер?


      1. dskonev
        05.11.2023 12:48
        +1

        Уважаемый, а хотите я анекдот про теоретиков и практиков расскажу?


        1. saboteur_kiev
          05.11.2023 12:48
          +1

          Таким практикам, как автор статьи, я регулярно помогаю на тостере.


  1. APh
    05.11.2023 12:48
    +2

    Команды Bash можно с легкость отрабатывать на Windows, если установить GIT и открыть консоль GIT.

    И тут же копия экрана MinGW... Может и нужно было писать про МинГВ и предлагать именно его и устанавливать?

    То, что при установке git, устанавливается ещё и МинГВ, никак не оправдывает.

    С таким же успехом можно было сказать, что для работы в Юникс-образной командной строке установите ПО " Ёклмн", в состав которого случайно входит МинГВ. ))


  1. etaradayko
    05.11.2023 12:48
    +1

    Я пользуюсь WSL если мне нужно сделать что-то непосредственно на моем компе.

    Я бы еще добавил одну из самых часто используемых команд:

    netstat -tunpl

    Ну и возможны вариации с фильтрами, сортировками и уникальными значениями.


    1. iig
      05.11.2023 12:48
      +1

      netstat deprecated. Нужно отвыкать.


      1. kekoz
        05.11.2023 12:48
        +1

        Ну, как бы не depecated, а obsoleted. И только в пингвиниксе. У остальных живёт и развивается.


  1. saboteur_kiev
    05.11.2023 12:48
    +1

    Это команда приведена только для примера, что через консоль можно делать поиск поверх предыдущего поиска. Так называемый многоступенчатый поиск. Встроенному поиску из-под GUI-IDE такое даже и не снилось.

    Смотря что использовать в GUI. Например FAR такое умеет...