LINUX.ORG.RU

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

 


0

1

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

Команда: ls -R lab0 2>> /tmp/maga | grep -n 'r$' | sort

Понимаю что написал неправильную команду и выводит она не то что нужно, как исправить команду чтобы поулчить нужный вывод?

Лабы в институте?

P. S.

Что значит вывести рекурсивно? Просто пройтись по всем файлам?

Поддиректрии смотреть?

«имя которых заканчивается на ‘r’» - расширение, или полное имя. имя ‘bar.txt’ заканчивается на ‘r’?

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 3)

Тебе надо учиться, а не просто получать зачёты, поэтому я полную команду не напишу, хотя мне это было бы проще. Но помогу найти нужное:

man find на предмет -name и -exec.

man cat на предмет -n.

man grep и man sort (ну тут ты вроде справился).

Совет: ты сперва просто напиши команду, чтоб на экран выводила, а перенаправление в файл потом добавишь, когда убедишься, что выводит что надо.

N.B.

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

Так в задании и было написано? У строк нет имён…

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

«имя которых заканчивается на ‘r’» - расширение, или полное имя. имя ‘bar.txt’ заканчивается на ‘r’?

Я вообще подумал, что строки должны заканчиваться на r… Раз там grep.

CrX ★★★★★
()

Я б это сделал как-то так.

#!/bin/bash

ACCESS_ERRORS_FILE_LOG='access_errors_files.log'
ACCESS_ERRORS_DIR_LOG='access_errors_dirs.log'

function LOG()
{
        echo "$*" > /dev/null  # Turn logs on or off
}

: > "$ACCESS_ERRORS_FILE_LOG"
: > "$ACCESS_ERRORS_DIR_LOG"

while read FILEPATH; do
        FILE_FULLNAME="$(basename $FILEPATH)"
        FILE_NAME="${FILE_FULLNAME%.*}"
        FILE_EXT="${FILE_FULLNAME##*.}"

        LOG "FILE: $FILEPATH -> $FILE_NAME . $FILE_EXT"

        if [[ ! "$FILE_NAME" =~ ^.*r$ ]]; then  # Check file name criteria
                LOG "  does not match criteria"
                continue
        fi
        if [[ ! -r "$FILEPATH" ]]; then  # Check file access
                echo "Cannot read file: $FILEPATH" >> "$ACCESS_ERRORS_FILE_LOG"
                continue
        fi

        echo "=== $FILE_FULLNAME"
        cat "$FILE_FULLNAME" | sed '=' | sed 'N;s/\n/:\t/' | sort -t$'\t' -k2  # Show file, add line numbers, sort lines
        echo

done <<< "$( find . -maxdepth 4 -type f 2> "$ACCESS_ERRORS_DIR_LOG" ) "  # Define 1) start dir 2) max depth 3) access errors file (for directories)

Может не корректно работать если в файле будут строки с табуляциями. И да, я люблю называть все переменные большими буквами, хоть это и не best practice.

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

Да, лаба в институте, надо пройтись по всем директориям и поддиректориям. У файлов там нет расширений так что названия которые заканчиваются на r просто надо

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