Найти файл с наибольшим количеством строк в одном каталоге - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь создать функцию, которая выводит только файл с наибольшим количеством строк в каталоге (без каких-либо подкаталогов).Меня просят использовать функцию wc, но я не совсем понимаю, как читать каждый файл по отдельности, а затем сортировать их, чтобы найти самое большое.Вот что у меня пока так:

#!/bin/bash

function sort {
[ $# -ne 1 ] && echo "Invalid number of arguments">&2 && exit 1;
[ ! -d "$1" ] && echo "Invalid input: not a directory">&2 && exit 1;
# Insert function here ; 
}

# prompt if wanting current directory
# if yes
    # sort $PWD
    # if no
        #sort $directory

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Используйте функцию, подобную этой:

my_custom_sort() {
   for i in "${1+$1/}"*; do 
     [[ -f "$i" ]] && wc -l "$i"
   done | sort -n | tail -n1 | cut -d" " -f2
}

И используйте ее с каталогом или без него (в последнем случае используется текущий каталог):

my_custom_sort /tmp
helloworld.txt
0 голосов
/ 21 сентября 2018

Это почти чистый Bash (wc - единственная используемая внешняя команда):

shopt -s dotglob    # Include filenames with initial '.' in globs
shopt -s nullglob   # Make globs produce nothing when nothing matches

dir=$1

maxlines=-1
maxfile=

for file in "$dir"/* ; do
    [[ -f $file ]] || continue      # Skip non-files
    [[ -L $file ]] && continue      # Skip symlinks

    numlines=$(wc -l < "$file")

    if (( numlines > maxlines )) ; then
        maxfile=$file
        maxlines=$numlines
    fi
done

[[ -n "$maxfile" ]] && printf '%s\n' "$maxfile"

Удалите shopt -s dotglob, если вы не хотите обрабатывать файлы, имена которых начинаются с точки,Удалите [[ -L $file ]] && continue, если вы хотите обрабатывать символические ссылки на файлы.

Это решение должно обрабатывать все имена файлов (те, которые содержат пробелы, те, которые содержат символы глобуса, те, которые начинаются с '-', те, которые содержат символы новой строки, ...), но он запускает wc для каждого файла, поэтому он может быть неприемлемо медленным по сравнению с решениями, которые одновременно загружают множество файлов в wc, если вам нужно обрабатывать каталоги с большим количеством файлов.

0 голосов
/ 21 сентября 2018

Как насчет этого:

wc -l * | sort -nr | head -2 | tail -1

wc -l подсчитывает строки (однако вы получаете ошибку для каталогов), затем сортируете в обратном порядке, обрабатывая первый столбец как число, затем принимайте первые двастрок, затем второй, поскольку нам нужно пропустить строку total.

wc -l * 2>/dev/null | sort -nr | head -2 | tail -1

2>/dev/null отбрасывает все ошибки, если вы хотите более аккуратный вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...