那是我的功能
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
}
答案 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