Полезные однострочники для Linux

Неочевидные связки из консольных команд на все случаи жизни

Настройки отображения темы Показывать по сообщений с сортировкой .
Выводить , отправленные .
Одна страница
Распечатать
4X_Pro
Создатель форума
Всего сообщений: 1336
Зарегистрирован: 9 дек 2015, 19:20
Рейтинг пользователя: 680

0
25 декабря 2018, 23:17. Редактировалось 2 раза, последний — 1 мая 2020, 15:00#1
В этой теме буду собирать различные полезные однострочники для Linux.

4X_Pro
Создатель форума
Всего сообщений: 1336
Зарегистрирован: 9 дек 2015, 19:20
Рейтинг пользователя: 680

0
25 декабря 2018, 23:23. Редактировалось 1 раз, последний — 25 декабря 2018, 23:24#2
Итак, начнем. Вот подсчет количества суммарного количества строк в файлах определенного типа во всех подкаталогах:
find ./ -name '*.php' -exec wc -l {} \;| awk '{ SUM += $1 } END {print SUM}'
Работает следующим образом: find, начиная с текущего каталога (./) ищет все файлы, маска для которых указана в параметре -name (в данном примере — *.php). Для каждого из найденных файлов запускается команда wc с параметром -l, чтобы считалось только число столбцов (без него еще считается число слов и символов). Получившийся результат из строк вида "число имя_файла" передается в awk, который производит суммирование по первому столбцу в переменную SUM, значение которой и выдается по окончанию работы.
В частности, с помощью такой команды можно подсчитывать общее число строк в том или ином программном продукте.

10geek
Единомышленник
Всего сообщений: 103
Зарегистрирован: 29 июн 2018, 09:36
Рейтинг пользователя: 2

1
2 февраля 2019, 11:02. Редактировалось 2 раза, последний — 2 февраля 2019, 11:07#3
Рекурсивный подсчёт большого количества файлов в каталоге:
find -L путь_к_каталогу -type f -printf \\n | awk 'BEGIN { count = 0 } { if(!(++count % 1000)) printf("%s\r", count) } END { print count }'
Показывает в реальном времени, сколько уже насчитано файлов через каждые 1000 файлов.
Опция -L нужна в случае, если требуется подсчитывать символические ссылки, указывающие на файлы. Имейте ввиду, что если указана опция -L, find будет рекурсивно переходить в каталоги, на которые указывают символические ссылки.

4X_Pro
Создатель форума
Всего сообщений: 1336
Зарегистрирован: 9 дек 2015, 19:20
Рейтинг пользователя: 680

1
20 сентября 2019, 15:07. Редактировалось 1 раз, последний — 20 сентября 2019, 15:12#4
Вывод списка всех видеовыходов (взято из документации по ArchLinux):
for p in /sys/class/drm/*/status; do con=${p%/status}; echo -n "${con#*/card?-}: "; cat $p; done
Полезно для использования в командной строке ядра video=выход:d для отключения ненужных портов.

10geek
Единомышленник
Всего сообщений: 103
Зарегистрирован: 29 июн 2018, 09:36
Рейтинг пользователя: 2

0
9 октября 2019, 01:05. Редактировалось 1 раз, последний — 9 октября 2019, 04:08#5
Вывод информации об IOMMU-группах PCI-устройств:
find /sys/kernel/iommu_groups -type l -exec sh -c 'IFS=/; set -- $0; printf '\''IOMMU Group %-4s '\'' "$5"; lspci -nns "$7"' {} \; | sort -n -k3
Может понадобиться для проброса PCI-устройств в виртуальные машины на KVM, Xen и других гипервизорах. Для проброса любого из устройств пробрасывать нужно все устройства из группы, в которой находится пробрасываемое устройство.

10geek
Единомышленник
Всего сообщений: 103
Зарегистрирован: 29 июн 2018, 09:36
Рейтинг пользователя: 2

0
10 марта 2020, 22:37. Редактировалось 1 раз, последний — 11 марта 2020, 18:21#6
Рекурсивный поиск по содержимому файлов *.gz. Опция -F — искать [шаблон] как строку, а не как регулярное выражение. Опция -i — регистронезависимый поиск.
find /usr/share/man -type f -name '*.gz' -exec zgrep -HFi [шаблон] {} \;

10geek
Единомышленник
Всего сообщений: 103
Зарегистрирован: 29 июн 2018, 09:36
Рейтинг пользователя: 2

1
27 апреля 2020, 22:53#7
Поиск файлов с SUID/SGID в системе:
find / \( -path /dev -o -path /proc -o -path /sys \) -prune -o -type f -perm /u=s,g=s -ls

10geek
Единомышленник
Всего сообщений: 103
Зарегистрирован: 29 июн 2018, 09:36
Рейтинг пользователя: 2

1
27 мая 2020, 21:29#8
Удаление дублирующихся элементов из массива в bash, в случае, если элементы массива могут содержать любые символы (кроме NULL, который является недопустимым):
eval "ARRAY=($(printf '%q\n' "${ARRAY[@]}" | awk '!($0 in dup) { print $0; dup[$0] = "" }'))"

Более производительный вариант, но не сохраняющий исходный порядок элементов (для сортировки элементов этот вариант не подходит, см. описание спецификатора %q в `help printf`):
eval "ARRAY=($(printf '%q\n' "${ARRAY[@]}" | sort -u))"

4X_Pro
Создатель форума
Всего сообщений: 1336
Зарегистрирован: 9 дек 2015, 19:20
Рейтинг пользователя: 680

1
Вчера, 00:11#9
Поиск каталога с самым большим количеством файлов (полезно, когда нужно выяснить, почему произошло превышение лимита квоты по файлам на хостинге):
find / -print0 | xargs -0 dirname | uniq -c | sort -n -k 1 | tail -1
Чтобы искать не от корня, а от другого каталога, нужно указать путь к нему после find вместо /.

Одна страница
Распечатать

У вас нет прав для отправки сообщений в эту тему.

Задать вопрос

Здесь можно задать мне вопрос или спросить совета по любой теме, затронутой в блогах или на форуме. После того, как я отвечу, вопрос и ответ появятся в соответствующем разделе. Но не забываем, что я — сторонник slow life, поэтому каких-либо сроков ответов не обещаю. Самые интересные вопросы станут основой для новых тем на форуме или записей в блоге.
Сразу предупреждаю: глупости, провокации, троллинг и тому подобное летит прямо в /dev/null.