LINUX.ORG.RU

помогите, пожалуйста, со скриптом


0

2

[code=c cpp] #!/bin/bash [br]echo «1. Написать скрипт, находящий в заданном каталоге и всех его подкаталогах все файлы, владельцем которых является заданный пользователь. Имя владельца и каталог задаются пользователем в качестве первого и второго аргумента командной строки. Скрипт выводит результаты в файл (третий аргумент командной строки) в виде полный путь, имя файла, его размер. На консоль выводится общее число просмотренных файлов. Проверить работу программы для каталога /usr пользователь root.» [br]find $2 -type f -user $1 -printf «%p%s\n» >$3 2>error.txt [br]file_num=0 [br]for file in `find $2 -type f 2>error.txt` [br]do [br]let «file_num+=1» [br]done [br]echo «Количество просмотренных файлов $file_num » [br]cat err.txt/tr -d `find:`

[/code]

Ответ на: комментарий от Zhbert

сча Розенталя достану,) буду грамотно с тире писать

Ray8888
() автор топика
Ответ на: комментарий от Shtucer

я разберусь в том, что буду сдавать, не сомневайтесь [br] и скорее всего перепишу, чтобы точно знать

Ray8888
() автор топика

Ну да, ну да

lorsh-4.0# threadctl --set-mode СПвПF development/6010441

Cancellor ★★★★☆
()
Ответ на: комментарий от rival

я тут покопалась чуток и похоже обнаружила у вас неточность: результат выполнения команды wc -l — количество символов перевода строки. Что может отличаться от реального количества строк в меньшую сторону.

Ray8888
() автор топика
Ответ на: комментарий от Ray8888

> Что может отличаться от реального количества строк в меньшую сторону.

Я не знаю, чем отличается «реальное количество строк» от «количества символов переноса строки», но там есть еще одна ошибка, известная мне.

rival ★★
()
Ответ на: комментарий от rival

я всё равно написала по своему, и кол-во файлов, там и там отличается... но я была бы не против,узнать в чём ваша ошибка

Ray8888
() автор топика
Ответ на: комментарий от Ray8888

> но я была бы не против,узнать в чём ваша ошибка
Скорее маленький недочет. Если бы я был преподавателем, я бы не стал придираться.

я всё равно написала по своему

Почему бы тебе не запостить свое решение?

rival ★★
()
Ответ на: комментарий от Ray8888

да оно собственно от первоначального отличается только | и правильным вызовом скрипта

#!/bin/bash

find $2 -type f -user $1 -printf "%p %s\n" >$3 2>error.txt

file_num=0
for file in `find $2 -type f 2>error.txt`
do let "file_num+=1"
done

echo "Количество просмотренных файлов $file_num "
cat error.txt | tr -d 'find:'

Вот этот, да?

Я считаю, что wc -l подсчитывает правильнее, я даже знаю почему.
Далее, я вспомнил про еще один недочет в данном мною скрипте выше, он также присутствует и здесь.
Первый недочет, кстати, никуда не исчез и все еще присутствует.

И еще тут следует обратить внимание на tr.

rival ★★
()
Ответ на: комментарий от rival

ну ещё я почитала и решила, что наверно, праильнее -type d, потому что /usr это же каталог, а не файл a tr, судя по man tr, просто удаляет на выводе find... хотя я, честно говоря, не очень поняла объяснение «удаляет из таблицы 1....» , которое там даётся

Ray8888
() автор топика
Ответ на: комментарий от Ray8888

> праильнее -type d
Нет.

хотя я, честно говоря, не очень поняла объяснение «удаляет из таблицы 1....» , которое там даётся

Всегда ведь можно просто посмотреть на примерах, как оно работает:
$ echo «test» | tr -d «t»

rival ★★
()
Ответ на: комментарий от rival

>$ echo «test» | tr -d «t»

спасибо, я про это не знала, я Linux вижу 2рую неделю и то периодически,просто он как-то тормозит и это не удобно.. ничего, может товарищ преподаватель соизволит поведать в чём неточности работы моего скрипта

но, несмотря на то, что Linux весь из себя такой хороший, зато люди, умеющиеobt в нём работать не очень корректно относятся к новичкам, это отбивает желание

как сказал мой друг: «Linux либо у садистов, либо у мазохистов»

меня вообще препод хотела заставить писать проверки, типа t=$PWD$2 if(что-то там равно или /) то ... но я не очень поняла его гениальную идею

Ray8888
() автор топика
Ответ на: комментарий от Ray8888

Вот тебе минимальный пример, на котором твой скрипт посчитает два файла, вместо одного:

$ mkdir -p /tmp/test
$ touch "/tmp/test/a file"
$ ls -l /tmp/test
$ ./script root /tmp/test/ output.txt

rival ★★
()
Ответ на: комментарий от Ray8888

>дело в том, что sh не вызывает все команды, которые есть в bash потому что, то что написано в Debian и правильно работает, то в убунту не факт

И в дебиане, и в убунту /bin/sh это просто симлинк на /bin/dash. Поэтому всё что работает на Dебиане будет работать и на убунту. Если писать без башизмов, то и на даше запускаться будет без проблем.

Heretique
()
Ответ на: комментарий от rival

`find test/* -type d | sed -e 's/^/\«/' | sed -e 's/$/\»/'`; это, конечно, жёстко... я эту запись не скоро пойму, да и смысл писать то, чего не понимаешь

по тем подручным материалам, которые нам дали, даже искать бесполезно расшифровку

Ray8888
() автор топика
Ответ на: комментарий от Ray8888

> | sed -e 's/^/\«/' | sed -e 's/$/\»/'

Это не решение, и автор вопроса об этом сам говорит, но он это пробовал и не помогло. Если интересно, это должно ставить кавычки в начале и в конце каждой строки.
Изучай внимательнее самый первый ответ.

rival ★★
()
Ответ на: комментарий от rival

а я со своим preintermediate с таким текстом немного даже теряюсь... сча почитаю

Ray8888
() автор топика
Ответ на: комментарий от rival

я так поняла, что-то вроде

while read file;

do echo «$file»;

done < <(find test -mindepth 1 -type f)

Ray8888
() автор топика
Ответ на: комментарий от rival

>Я считаю, что wc -l подсчитывает правильнее, я даже знаю почему.

может поделитесь этой страшной тайной с общественностью или вы унесёте её с собой в могилу?

Ray8888
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.