LINUX.ORG.RU

История изменений

Исправление Kroz, (текущая версия) :

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

#!/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, :

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

#!/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, :

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

#!/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
        # cat "$FILE_FULLNAME" | sed '=' | sed 'N;s/\n/:\t/'
        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.