我正在尝试创建一个仅输出目录(而不是任何子目录)中具有最大行数的文件的函数。我被要求使用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
答案 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
的解决方案相比,速度慢得令人无法接受。