Существует ли инструмент командной строки, подобный `ls `, но который также показывает дополнительную информацию о первой строке каталога (из README.md, например)

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

case ${OS} in
"SUSE Linux Enterprise Server 11 SP4")
    echo "SLES11 detected."
    ;;
Ubuntu\ 16.04.[3-4]\ LTS)
    echo "UBUNTU16 detected."
    ;;
"CentOS Linux 7 (Core)")
    echo "CENTOS7 detected."
    ;;
*)
    echo "Unknown OS detected. Quitting for safety reasons."
    exit -1
    ;;
1
21.12.2020, 11:32
1 ответ

Такого инструмента нет; но это UNIX, так что вы легко можете его создать.:-)


Не имея файлов README.md, вместо этого я буду использовать .gitignoreв качестве файла в каждом подкаталоге для печати первой строки из:

find. -type d -printf '%30f ==> ' -exec sed q {}/.gitignore \;

Пример вывода:

                   control-DBs ==> autogen.h
                         basic ==> flarp.exe
                    postgresql ==> libpgstore.a
                            ui ==>.DS_Store
                       plugins ==> *.*~

Как это работает

  • -type d:Мы ищем только подкаталоги.
  • printf '%30f ==> ':-printfпринимает кучу кодов, для вывода различной информации о файле(с технической точки зрения, каталог — это своего рода обрабатываемый файл ). Кодов достаточно, чтобы эмулировать вывод ls(1)с более простыми опциями. Полный список см. в man findили https://man7.org/linux/man-pages/man1/find.1.html. некоторые обязательные -есть
    • %f:базовое имя
    • %s:размер в байтах
    • %m:разрешение (или биты режима)
  • -exec sed q {}/.gitignore \;:Здесь мы даем find(1)пользовательскую команду для выполнения для каждого обрабатываемого подкаталога.
    • {}обозначает путь к файлу
    • sed q fff— это один из способов распечатать первую строку файла «fff»
    • \;сообщает find(1), где заканчивается пользовательская команда.

Что, если только в некоторых подкаталогах есть .gitignore?

find. -type d -exec [ -e {}/.gitignore ] \; -printf '%30f ==> ' -exec sed q {}/.gitignore \;

Мы снова обращаемся к -execза помощью. Допустим, обрабатываемый в данный момент подкаталог называется "ddd"; тогда [ -e ddd/.gitignore ]будет оцениваться как false, если в ddd/нет .gitignore. Как только проверка дает ложный результат, find(1)сдается и переходит к следующему подкаталогу.

0
18.03.2021, 22:41

Теги

Похожие вопросы