那是我的函数
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