Это почти чистый 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
, если вам нужно обрабатывать каталоги с большим количеством файлов.