bash:循环中忽略读取命令

时间:2019-09-19 09:41:42

标签: bash macos

我正在使用一些代码来检查某些文件是否相互匹配,然后向用户提示问题并根据用户的响应采取适当的措施。但是,bash完全忽略了我的读取命令!

declare -i int
int=1
find ./1 -name '*.xyz' | while read FILENAME
do
find . -name '*.xyz' | while read FILENAME2
do
    if [ $FILENAME != $FILENAME2 ]; then
        if [ $(dirname "${FILENAME}") != $(dirname "${FILENAME2}") ]; then
            if [ $(basename "${FILENAME}") == $(basename "${FILENAME2}") ]; then
                int=int+1
                if cmp -s "$FILENAME" "$FILENAME2" ; then
                    echo "Match", "$FILENAME", "$FILENAME2", "$int"
                else
                    # echo "No Match", "$FILENAME", "$FILENAME2", "$int"
                    read -p "No match modify? (y/n)" d
                    echo "$d ";
                fi
                if [ "$int" -gt 44 ]; then
                    exit 1
                fi
            fi
        fi
    fi
done
done 

我正在使用osx。 我已经检查了一个简单的读取命令,并且在我的终端机(iterm)上的循环外正常运行了。

1 个答案:

答案 0 :(得分:1)

整个% function entry sum(N) -> sum(N,0); sum(0,Acc) -> Acc; sum(N,Acc) -> sum(N-1,Acc+N). 循环都重定向了其标准输入。任何while都会消耗read而不是用户终端输入的一行内容。

无论如何,在外循环内重复运行相同的find命令效率极低。可能将来自两个find命令的结果收集到两个数组中,然后简单地循环遍历内存中的字符串,而不是一遍又一遍地遍历同一目录中的磁盘。

但是,如果您尝试查找find之外的文件,而这些文件与1中的同名文件相同,则一种更有效的方法是运行

1

然后使用简单的Awk脚本处理重新生成的输出。也许是这样的:

find . -name '*.xyz' -exec shasum {} +