繁体   English   中英

如何查找文件并对其进行计数(将信息存储到变量中)?

[英]How to find files and count them (storing the info into a variable)?

我想根据找到的文件数进行条件操作:

found=$(find . -type f -name "$1")
numfiles=$(printf "%s\n" "$found" | wc -l)

if [ $numfiles -eq 0 ]; then
    echo "cannot access $1: No such file" > /dev/stderr; exit 2;
elif [ $numfiles -gt 1 ]; then
    echo "cannot access $1: Duplicate file found" > /dev/stderr; exit 2;
else
    echo "File: $(ls $found)"
    head $found
fi

编辑代码(以更准确地反映我的需求)

但是,当找到重复文件时,numfiles不等于2(或更大)...

所有文件名都位于一行中,并以空格分隔。

另一方面,这可以正常工作:

find . -type f -name "$1" | wc -l

但我不想在if / then / else构造中进行两次递归搜索...

添加-print0也无济于事。

什么会?

PS-始终欢迎简化或改进!

使用$()将数据存储到变量会修剪尾部空白。 由于最后的换行符未出现在变量numfiles ,因此wc误计数了一个。 您可以使用以下方法恢复尾随的换行符:

numfiles=$(printf "%s\n" "$found" | wc -l)

如果found为空(并且任何文件名包含换行符),则会发生错误计数,从而强调了整个方法都存在错误的事实。 如果您真的想这样做,可以尝试:

numfiles=$(test -z "$numfiles" && echo 0 || printf "%s\n" "$found" | wc -l)

或将find的输出通过管道传递给脚本,该脚本对输出进行计数并打印计数以及第一个文件名:

    find . -type f -name "$1" | tr '\n' ' ' | 
    awk '{c=NF; f=$1 } END {print c, f; exit c!=1}' c=0 |
    while read count name; do 
        case $count in 
        0) echo no files >&2;; 
        1) echo 1 file $name;; 
        *) echo Duplicate files >&2;; 
        esac;
    done

如果任何路径名包含空格,所有这些解决方案都会惨遭失败。 如果那很重要,您可以将awk更改为perl脚本,以使其更容易处理空分隔符并使用-print0,但实际上我认为您应该不再担心特殊情况。 (找到-exec和find | xargs都不能干净地处理0个匹配大小写的文件。可以说,这个awk解决方案也不能干净地处理它。)

您要find文件并计数名称为“ $ 1”的文件:

grep -c "/${1}$" $(find . 2>/dev/null)

并将结果存储在var中。 在一个命令中:

numfiles=$(grep -c "/${1}$" <(find . 2>/dev/null))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM