Ах, я чувствую себя немного глупо, оказывается, все, что мне нужно было сделать, это скопировать пример файла конфигурации в ~/.config/compton/compton.conf и изменить бэкэнд на xrender перед изменением строки в моем.xinitrc к:
compton --config ~/.config/compton/compton.conf -b
с -n
и передачей нескольких файлов вывод будет в этом формате:
file_name:line_number:matched_text
-x
соответствует всей строке
grep '#!/bin/bash' -nx *.sh |cut -d ':' -f 1,2 | grep ":1$" | cut -d ':' -f 1
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
В 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
, так как мы ищем фиксированную строку.
Я знаю, что вы занесли 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...