nixp.ru v3.0

26 мая 2017,
пятница,
06:38:54 MSK

DevOps с компанией «Флант»
zi007 написал 22 мая 2006 года в 16:20 (345 просмотров) Ведет себя неопределенно; открыл 2 темы в форуме, оставил 2 комментария на сайте.

В общем есть вот такой вот мой скрипт:

#!/bin/bash

Int_INT()

{

let «i += 1»

echo «$i\n»

if [ "$i" -eq 6 ]

then

echo «GOOD BYE.\n»

exit 0

fi

if [ "$FLAG_INT" = 0 ]

then

echo enter mode

fi

}

i=0

FLAG_INT=0

trap Int_INT 2

if [ "$FLAG_INT" = 0 ]

then

echo hello enter mode

read mode

FLAG_INT=1

echo mode=$mode

fi

find /home/guest/zi007 -name \*.c | xargs chmod $mode

sleep 1

sleep 1

sleep 1

sleep 1

sleep 1

sleep 1

————————-

а задача,которая должна им решаться такая:

надо найти все файлы с расширение *.c и поменять права доступа на введенные.

Первые 5 прерываний игнорить, а на 6-ой прерывание вывести число файлов с измененными правади доступа.

Вот в общем -то вся запарка состоит в том,что никак не могу подсчитать

то число файлов.

Точнее сказать не знаю как это влепить в конвейер,где идет поиск файлов и изменение прав доступа к ним.

Хелп народ,буду очеь признателен!

пасиб

fly4life

Странная какая-то задача… Раз уж тебе надо поменять права на все файлы, оканчивающиеся на '.c’, то искомое тобой число — это количество таких файлов в указанной директории ;). Оно вот чему равно:

ls -1 /home/guest/zi007/*.c | wc -l

Но на самом деле, твой скрипт не выполняет приведённые тобой требования. Он завершает свою работу спустя 6 секунд после смены прав на файлы. Никаких 6-ти прерываний скрипт не ждёт.

Тебе же для решения задачи, достаточно включить 'trap’, 'read' и строку с 'find' в бесконечный цикл, и скрипт будет ждать ввода новых прав, пока не последует 6-ти прерываний:

#!/bin/bash
Int_INT()
{
      let i+=1
      echo "$i"
      if [ "$i" -eq 6 ]
      then
            echo "number of chmoded files = $COUNT"
            echo "GOOD BYE."
            exit 0
      fi
}
i=0
echo "enter mode"
while true
do
            trap Int_INT 2
            read mode
            echo mode=$mode
            find /home/guest/zi007/ -name \*.c | xargs chmod $mode
            COUNT=`ls -1 /home/guest/zi007/*.c | wc -l`
done
rgo

предлагаю небольшую оптимизацию, вместо:

find ./ -name /home/guest/zi007/\*.c | xargs chmod $mode
COUNT=`ls -1 /home/guest/zi007/*.c | wc -l`

написать:

COUNT=`find /home/guest/zi007/ -name '*c' \
     | xargs chmod -v +r $mode  | wc -l`
fly4life
rgo
предлагаю небольшую оптимизацию, вместо:

find ./ -name /home/guest/zi007/\*.c | xargs chmod $mode
COUNT=`ls -1 /home/guest/zi007/*.c | wc -l`

Упс, тут в первой строке у меня очепятка… Поправил в скрипте.

rgo
написать:

COUNT=`find /home/guest/zi007/ -name '*c' \
     | xargs chmod -v +r $mode  | wc -l`

А зачем у chmod опция '+r’?

rgo
А зачем у chmod опция '+r’?

случайно осталась :)

я в командной строке с такими опциями тестировал не без-очепятность.

zi007

пасиб народ за помощь.

единственное,только вот я заменил бы

COUNT=`ls -1 /home/guest/zi007/*.c | wc -l`

на

COUNT=’find /home/guest/zi007 -name \*.c | wc -l '

ибо ls только для данного каталога,а если файлы еще и в подкаталогах, то они не находятся,вот …а так благодарен всем,кто откликнулся.

Тему завершаю вот своим скриптом:

#!/bin/bash

Int_INT()

{

let «i +=1»

if [ "$i" = 6 ]

then

echo «number of changed files = $COUNT»

echo «GOOD BYE.»

exit 0

else

echo «INT_NUM= $i»

fi

if [ "$FLAG_INT" = 0 ]

then

echo enter mode

fi

}

i=0

FLAG_INT=0

while true

do

trap Int_INT 2

if [ "$FLAG_INT" = 0 ]

then

echo enter mode

read mode

FLAG_INT=1

fi

find /home/guest/zi007 -name \*.c | xargs chmod $mode

COUNT=`find /home/guest/zi007 -name \*.c | wc -l`

done

echo «enter ^C to exit\\n»

i=5

trap INT