在管道回声时抑制输出到StdOut

时间:2012-04-24 19:20:22

标签: bash unix echo pipe

我正在制作一个抓取目录的bash脚本,并将某种类型的所有文件输出到文本文件中。我有那个工作,它只是写出一堆输出到控制台我不想要(文件的名称)

到目前为止,这是相关代码,tmpFile是我写的文件:

for DIR in `find . -type d` # Find problem directories
do
        for FILE in `ls "$DIR"` # Loop through problems in directory
        do
                if [[ `echo ${FILE} | grep -e prob[0-9]*_` ]]; then
                        `echo ${FILE} >> ${tmpFile}`
                fi
        done
done

我放入文本文件的文件采用正则表达式[0-9] * _描述的格式(类似于prob12345_01)

我将echo $ {FILE}的输出传递给grep,它仍然输出到stdout,这是我想要避免的。我认为这是一个简单的修复,但它正在逃避我。

3 个答案:

答案 0 :(得分:3)

所有这一切都可以在一个find命令中完成。考虑一下:

find . -type f -name "prob[0-9]*_*" -exec echo {} >> ${tmpFile} \;

编辑:

更简单:(感谢 @GlennJackman

find . -type f -name "prob[0-9]*_*" >> $tmpFile

答案 1 :(得分:3)

要回答您的具体问题,您可以将-q传递给grep以获取静默输出。

if echo "hello" | grep -q el; then
  echo "found"
fi

但是由于你已经在使用find,所以只需一个命令就可以完成:

find . -regex ".*prob[0-9]*_.*" -printf '%f\n' >> ${tmpFile}

find的正则表达式是整个路径上的匹配,这就是需要前导.*的原因。

-printf '%f\n'打印没有目录的文件名,以匹配您的脚本正在执行的操作。

答案 2 :(得分:1)

你想要做的是read find命令的输出,
对于返回的每个条目find,您希望获取该位置下的所有文件(*) 然后你想检查那个文件名是否与你想要的模式匹配 如果匹配则将其添加到tmpfile

while read -r dir; do
    for file in "$dir"/*; do  # will not match hidden files, unless dotglob is set
        if [[ "$file" =~ prob[0-9]*_ ]]; then
            echo "$file" >> "$tmpfile"
        fi
done < <(find . -type d)

然而find可以单独做到这一点 anubhava让我在那里;)
所以看看他的答案是如何完成的