LINUX.ORG.RU

Рекурсивный вывод строк с их номерами

 


0

1

Задание:Рекурсивно вывести содержимое файлов с номерами строк из директории lab0, имя которых заканчивается на ‘r’, строки отсортировать по имени a->z, ошибки доступа перенаправить в файл в директории /tmp

Команда которую я использую: ls -R lab0/* | grep 'r$' | sort | xargs cat -n

В lab0 у меня нет подобных файлов, но они есть в подкаталогах, поэтому я использую lab0/*, вот только при выполнении команды cat, bash пишет что таких файлов нет:«cat: gengar: No such file or directory». Правильно ли я понимаю что я не так передаю ответ в cat? Если да, то что нужно подправить

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

Если я обратился сюда, то вероятно он мне не помог, chat gpt как минимум путает флаги у команд, я боюсь что такое ему нельзя доверять

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

Что-то Вы напутали чутка, по-моему.

Рекурсивно вывести

ls для этого не подойдёт - он выводит не рекурсивно

строки отсортировать по имени

а Вы сортируете не содержимое, а имена файлов

Вообще задание какое-то невнятное. И кто так формулирует? «рекурсивно вывести» - что это вообще значит? :)
«заканчиваются на r» - строки или имена файлов всё-таки?..

PeleWin
()
Последнее исправление: PeleWin (всего исправлений: 1)
Ответ на: комментарий от superuser

я если честно уже около недели ломаю голову над этой командой, только она мешает мне сдать скрипт под эту лабораторную работу. Практик предложил использовать cat -n r*, но тогда скрипт выдаёт другую ошибку, о том что нет файла или директории r*

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

Буквально флаг -R у ls должен выводить рекурсивно. Со вторым согласен, но я даже эти строчки получить не могу, не то что их отсортировать

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

Университет ИТМО, я подозреваю что всё таки файлы

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

флаг -R у ls должен выводить рекурсивно

Действительно! Век живи - век учись! :-)

PeleWin
()
Ответ на: комментарий от acrighthere

Практик предложил использовать cat -n r*, но тогда скрипт выдаёт другую ошибку, о том что нет файла или директории r*

А они есть вообще - «файл или директория r*» ?

PeleWin
()

вот только при выполнении команды cat, bash пишет что таких файлов нет

При выполнении ls -R lab0/ оно выводит название каталога и потом названия файлов в нем. Следовательно, на вход cat -n получает пачку названий файлов. И поскольку в текущем каталоне оно не находит таких файлов – ругается No such file or directory.

Тут даже речь не идет о знании баша… Тут банальная логика, если посмотреть что выводит ls -R ....

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

Практик предложил использовать cat -n r*

Практик нихрена не шарит в том, что преподаёт, лишь бы побольше понтов набрать. cat -v considered harmful.

kaldeon
()
Ответ на: комментарий от superuser

часть chat gpt,часть одногруппник. Практик мне посоветовал:" вариант cat -n r* ну и рекурсивно в контексте лабы можно просто добавить /r //r* и так далее." Это именно про вывод я его спрашивал, то есть конечно целая команда должна быть больше чем он мне написал

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

Проблема в том, что за использование find нас как сказал лектор могут если культурно выразится «послать». Он сказал что в таком случае практик задаст вам пару углубленных вопросов по команде, на которые он уверен, что мы не ответим. Использование find в целом очень сильно упростило бы лабораторную работу в целом)

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

Используй du -a тогда, фильтром убирая размер файлов. Свидетели юникса считают (не без оснований) этот вариант предпочтительным.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 2)
Ответ на: комментарий от acrighthere

просто не понимаю как это поправить,

Тебе принципиально нужно чтоб список доставался при помощи ls -R? Ведь при помощи find куда логичнее и удобнее.

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

я уже объяснил чуть выше почему так делать нельзя. Конечно было бы удобнее, учитывая что у меня ещё 5 подобных заданий,и их тоже можно было бы через find решить, но потом накажут за это на сдаче лабораторной

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

спасибо, почитаю про эту команду, но проблему это к сожалению не решит

acrighthere
() автор топика
Последнее исправление: acrighthere (всего исправлений: 1)

Рекурсивно вывести содержимое файлов с номерами строк из директории lab0

Если выводить содержимое файлов с номерами строк, то как потом сортировать по [a-z] если начинаться они будут с номера? Тут явно какая-то хрень с заданием. Объясни, на каком этапе этой цепочки должны фигурировать номера строк.

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

вероятно после сортировки, мне их хотя бы без строк вывести для начала

acrighthere
() автор топика
ifs = '
'

du -a $home/2024 |grep 'r$' |while (f = `{read}) {
	f = `{echo $f |sed 's/^[0-9]*	//'}
	if (! test -r $f)
		echo 'file not readable: '$f >/tmp/errors
	if not if (! test -f $f)
		true # not a file
	if not
		grep -n '^.*$' $f
}

Детали реализации адаптируешь под свои нужды =)

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от iron

я понял что я протупил, там в каждом подходящем файле вцелом одна строка)

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

вы правы, вероятно практик написал мне неправильно) они соответствуют маске 4$ если я не ошибаюсь

acrighthere
() автор топика
ls -R lab0 | grep ':$' | tr -d ':' | xargs -I{} sh -c 'cat {}/*r 2>/tmp/errors.log' | cat -n

В файле /tmp/errors.log будут ошибки.

iron ★★★★★
()

строки отсортировать по имени a->z

Это как?

ya-betmen ★★★★★
()
Ответ на: комментарий от acrighthere

А ваш практик сам-то может ответить на пару углублённых вопросов по поводу парсинга выхлопа ls и того, что за такое делают в приличных местах? Чему молодёжь учит, капец.

anonymous
()
Ответ на: комментарий от futurama

Дык это ТС должен был посмотреть, а не ты.

И не фильтровать, а поменять опции для ls

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

но потом накажут за это на сдаче лабораторной

Всегда вымораживала незамутнённая логикой мстительность и преследование инакомыслящих, даже если это касается того, с какой стороны разбивать яйцо.
А потом так и работают:
- А может пилу наточить?
- Нам некогда! Работать надо!

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

Не знаю не знаю, я через Ls уже сделал и фиг с ним, осталось только всё это сдать, потому что сдать скрипт это малое дело, а вот ответить потом на все вопросы, это уже другое

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

а вот ответить потом на все вопросы

А скажи ему обосновать дебильность постановки задачи. Если не ответит – скажи пускай приходит со своими задачами тогда, когда они будут вменяемы. А еще можешь забрать у него ведомость, вписать его фамилию и поставить ему 2)))

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

«рекурсивно вывести» - что это вообще значит?

обработать (считать) рекурсивно, в процессе обработки вывести.

по завершению обработки тоже можно, но это хуже, так как потребляет неограниченное количество памяти.

Shushundr ★★★★★
()

Попробуй это вместо первой секции конвейера:

ls -1R | xargs realpath | grep -v ':$'
Nervous ★★★★★
()
Ответ на: комментарий от iron

Я сегодня утром осознал что я часть недоделал, так я с неё вообще выпал: Удалить директорию quagsire4 Удалить директорию lab0/quagsire4/mightyena Буквально два задания идущих подряд при том что quagsire4 уже в lab0, других таких нет

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

cпасибо большое, немного доработав команду, сдал сегодня весь скрипт, осталось доп задание сдать

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

Проблема в том, что за использование find нас как сказал лектор могут если культурно выразится «послать»

Чем мотивируют?

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

Тем что с нашим уровнем понимания работы эвм и UNIX, мы не сможем понять как работает find

acrighthere
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.