Печать только имени файла после поиска шаблона в первой строке (с использованием grep и head)

Ах, я чувствую себя немного глупо, оказывается, все, что мне нужно было сделать, это скопировать пример файла конфигурации в ~/.config/compton/compton.conf и изменить бэкэнд на xrender перед изменением строки в моем.xinitrc к:

compton --config ~/.config/compton/compton.conf -b
0
22.05.2020, 02:22
4 ответа

с -nи передачей нескольких файлов вывод будет в этом формате:

file_name:line_number:matched_text

-xсоответствует всей строке

grep '#!/bin/bash' -nx *.sh |cut -d ':' -f 1,2 | grep ":1$" | cut -d ':' -f 1

0
18.03.2021, 23:33
find. -perm -a+x -name '*.sh' -type f |
    while IFS= read -r file; do
        test -f "$file" || continue
        if head -n 1 "$file" | grep -qFx '#!/bin/bash'; then
            echo "$file"
        fi
    done
1
18.03.2021, 23:33

В GNU grepвы можете использовать опцию --labelдля установки метки/имени файла, если ввод поступает со стандартного ввода.

Вместо использования внешнего цикла с подстановкой команд вы можете использовать действие -execдля запуска небольшого скрипта для циклического перебора имен файлов и выполнения команд.

find -perm -a+x -name "*.sh" -type f -exec sh -c '
  for fis; do
    head -n1 "$fis" | grep --label="$fis" -Fl "#!/bin/bash"
  done
' sh {} +

Я добавил параметр -Fк grep, так как мы ищем фиксированную строку.

3
18.03.2021, 23:33

Я знаю, что вы занесли awk в черный список, но для других людей, ищущих помощи, которые сталкиваются с вашим вопросом, это довольно эффективный способ печатать имена исполняемых .shфайлов, содержащих #!/bin/bashв своей первой строке :

. ]
find. -perm -a+x -name '*.sh' -type f -exec \
    awk 'NR == 1{ if ($0 == "#!/bin/bash") print FILENAME; exit }' {} \;

Или, чтобы напечатать имена файлов, в первой строке которых есть #!/bin/bashбез дополнительных ограничений, отбросьте опции -permи -name:

find. -type f -exec awk...
2
18.03.2021, 23:33

Теги

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