在单个目录中查找具有最大行数的文件

时间:2018-09-21 05:34:50

标签: linux bash unix

我正在尝试创建一个仅输出目录(而不是任何子目录)中具有最大行数的文件的函数。我被要求使用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 :(得分:0)

如何?

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会丢弃所有错误。

答案 1 :(得分:0)

使用如下函数:

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

答案 2 :(得分:0)

此解决方案几乎是纯Bash(project -src --main --test 是唯一使用的外部命令):

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

此解决方案应处理所有文件名(一个包含空格,一个包含glob字符的文件,一个以'-'开头的文件,一个包含换行符的文件...),但是它为每个文件运行[[ -L $file ]] && continue,因此可能如果您需要处理包含大量文件的目录,则与将多个文件立即馈送到wc的解决方案相比,速度慢得令人无法接受。