为什么 'echo $(find) | wC语言 l' 不能正确计算文件数?



那是我的函数

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
}

问题出在getFile函数上。您在那里所做的是找到jpeg(或其他(文件的名称,然后echo这些名称。它的作用是在一行中打印所有这些。例如,这是我得到的

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

然后你尝试用wc -l来计算那些,这基本上计算输出中的行数,因此它总是得到 1。

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

只需从getFile()中删除echo即可工作

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

计算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

最新更新