Использование ksh для возврата файла с наибольшим количеством строк в каталоге

Я пишу сценарий ksh-файла, где я ищу, чтобы вернуть файл с наибольшим количеством строк в каталоге. Сценарий может принимать только один аргумент и должен быть допустимым каталогом. У меня есть 2 случая ошибок, но у меня возникли проблемы с файлами с максимальной строкой до сих пор, у меня есть ниже:

#!/bin/ksh
#Script name: maxlines.sh
ERROR1="error: can only use 0 or 1 arguments.\nusage: maxlines.sh [directory]"
ERROR2="error: argument must be a directory.\nusage: maxlines.sh [directory]\n"
$1
if [[ $# -gt 1 ]]
        then
                printf "$ERROR1"
                exit 1
fi
if [ ! -d "$1" ]
        then
        prinf "$ERROR2"
fi
for "$1"
do
    [wc -l | sort -rn | head -2 | tail -1]

Из того, что я обнаружил, максимальное количество строк будет получено от использования wc, но я не уверен в форматировании, так как я все еще новичок в сценариях оболочки. Любой совет поможет!

2 ответа

Решение
> for "$1"
> do
>    [wc -l | sort -rn | head -2 | tail -1]

for В цикле есть небольшая синтаксическая ошибка, и квадратные скобки полностью не на месте. В любом случае вам не нужна петля, потому что wc принимает список аргументов имени файла.

wc -l "$1"/* | sort -rn | head -n 1

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

Если вы хотите перебрать файлы в $1, это будет выглядеть

for variable in list of items
do
    : things with "$variable"
done

где list of items может быть подстановочным выражением "$1"/* (как указано выше), а do... done возьмите то место, где вы представляете, что вам нужны квадратные скобки.

(Квадратные скобки используются в сравнениях; [ 1 -gt 2 ] управляет [ Команда для сравнения двух чисел. Он может сравнивать много разных вещей - строки, файлы и т. Д. ksh также имеет более развитый вариант [[ который имеет некоторые особенности по сравнению с традиционным [.)

Мои цитаты немного ржавые, но попробуйте этот скрипт оболочки Bourne:

#!/bin/sh
#Script name: maxlines.sh
ERROR1="error: can only use 0 or 1 arguments.\nusage: maxlines.sh [directory]"
ERROR2="error: argument must be a directory.\nusage: maxlines.sh [directory]\n"
echo argument 1: "$1"
if [ $# -gt 1 ]
        then
        echo "$ERROR1"
    exit 1
fi
if [ ! -d "$1" ]
        then
        echo "$ERROR2"
    exit 1
fi
rm temp.txt
#echo "$1"/*
for i in "$1"/*
    do
    if [ -f "$i" ] 
        then
            #echo 2: $i
            wc -l "$i" >> temp.txt
        #else echo $1 is not a file!
    fi
    done
cat temp.txt | sort -rn | head -1
Другие вопросы по тегам