为什么`echo $(find)| wc -l`无法正确计算文件数?

时间:2020-06-24 12:52:54

标签: bash

那是我的功能

function getFile(){
    echo $(find . -type f -regextype egrep -regex ${REGEX:-'.*\.(jpe?g|JPE?g)$'})
}

当我尝试让getFile返回其他功能时

function resize(){
    (( i=1 ))
    local k=`getFile | wc -l`
    echo $k
}

如果我没有,我的结果会不同

function resize(){
    (( i=1 ))
    local k=`find . -type f -regextype egrep -regex ${REGEX:-'.*\.(jpe?g|JPE?g)$'} | wc -l`
    echo $k
}

2 个答案:

答案 0 :(得分:2)

问题出在getFile函数中。您要做的是找到jpeg(或任何其他文件)的名称,然后echo。它的作用是将所有这些打印在一行中。例如,这就是我所拥有的

./photo_2019-07-18_22-20-451.jpg ./photo_2019-07-18_22-20-45.jpg

然后,您尝试使用wc -l进行计数,该计数基本上计算输出中的行数,因此总为1。

另一方面,在第二个函数中,您不再回显不再是单行的结果,从而给出了正确的答案。

只需将echo中的getFile()删除,它将起作用

function getFile() {
    find . -type f -regextype egrep -regex ${REGEX:-'.*\.(jpe?g|JPE?g)$'};
}

它输出

$ getFile

./photo_2019-07-18_22-20-451.jpg
./photo_2019-07-18_22-20-45.jpg

最后

function resize(){
    (( i=1 ))
    local k=`getFile | wc -l`
    echo $k
}
$ resize
2

答案 1 :(得分:1)

find的输出行进行计数非常脆弱,因为可以想象文件名可以包含换行符。由于您似乎不受POSIX兼容性的限制,因此我会使用类似的

find . -type f -regextype egrep -regex "${REGEX:-.*\.(jpe?g|JPE?g)$}" -printf '.' | wc -c

获取计数。 (无论文件名是什么,find都只输出一个字符wc计数。)

如果有时仍然需要getFile来生成实际的文件名(请注意,单个输出行可能不是完整的文件名),则可以对函数进行参数化,例如:

getFile () {
  find_opts=(. -type f -regextype egrep -regex ${REGEX:-'.*\.(jpe?g|JPE?g)$'})
  count=
  for arg; do
    case $arg in
      -c) find_opts+=(-printf '.'); count=1 ;;
    esac
  done

  find "${find_opts[@]}" | if [ -z "$count" ]; then cat; else wc -c; fi
}

然后您可以运行

$ getfile
foo.jpg
bar.jpg

$ getfile -c
2