Возможно, я бы сделал так
found=$(find <path to files> -maxdepth 1 -not \( -user root -group root \) -printf "x")
found=${found:+Fail}
echo ${found:=Pass}
Однако самый простой способ изменить сценарий —:
found="Pass"
for x in $(ls -llA <path to files> | awk 'FNR>2{ print $3,$4 }' )
do
if [ "${x}" != "root" ]
then
found="Fail"
break
fi
done
echo $found
Здесь я добавил флаг A, чтобы перехватывать файлы, начинающиеся с "."
Однако делать это таким образом не рекомендуется, так как имена файлов, содержащие новую строку, приведут к неожиданным результатам.
Учитывая сложный набор требований, awk лучше подходит для решения этой проблемы.
Эквивалентом печати sed от начала до конца является (в awk):
$ awk '/^ddd/{p=1};p;/^[/]ddd/{p=0}' file
ddd Start of Match group #1
eee
fff
/ddd End of Match group #1
ddd Start of Match group #2
iii
yyy
/ddd End of Match group #2
Использование ^
гарантирует, что amtch находится в начале строки, а [\]
будет соответствовать только \
также в начале строки.
Переключая тесты, мы можем удалить начальную и конечную линии:
$ awk '/^[/]ddd/{p=0};p;/^ddd/{p=1}' file
eee
fff
iii
yyy
Осталось проверить, (находится ли внутри одного диапазона )какая-либо строка с fff
. Это можно сделать с помощью:
awk ' /^[/]ddd/{p=0;if(found==0){print NR};found=0};
p&&($0~/fff/){found=1};
/^ddd/{p=1}
' file
Будет напечатан номер строки (NR )последней строки группы, не содержащей fff
внутри.
Попробуйте
sed -n '/ddd/ {:L; N; /\/ddd/!bL; /fff/ !{p; =;} }' file
При обнаружении ddd
он собирает строки до /ddd
в пространстве шаблонов, затем проверяет fff
и, если отсутствует, печатает группу и номер последней строки группы.