Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 管道回波时抑制输出到标准输出_Bash_Unix_Echo_Pipe - Fatal编程技术网

Bash 管道回波时抑制输出到标准输出

Bash 管道回波时抑制输出到标准输出,bash,unix,echo,pipe,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

我正在制作一个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
我放入文本文件的文件的格式由正则表达式prob[0-9]*.\u(类似于prob12345\u 01)描述


当我将echo${FILE}的输出通过管道传输到grep中时,它仍然会输出到stdout,这是我想要避免的。我认为这是一个简单的解决方案,但我还是不明白。

您要做的是,
读取
查找
命令的输出,
对于返回的每个条目
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)
读取时-r dir;做
对于“$dir”/*中的文件;do#将不匹配隐藏文件,除非设置了dotglob
如果[[“$file”=~prob[0-9]*.];然后
回显“$file”>>“$tmpfile”
fi

完成<所有这些都可以在一个find命令中完成。考虑这一点:

find . -type f -name "prob[0-9]*_*" -exec echo {} >> ${tmpFile} \;
编辑: 更简单的是:(多亏了@GlennJackman


要回答您的具体问题,您可以将
-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”
打印不带目录的文件名,以匹配脚本所做的操作。

我很喜欢这个解决方案,我看到了它的工作原理,但是它生成了两个文件,都不包含正确的数据。tmpfilevar实际上只是TMP_计数器,我得到的文件是TMP_计数器和TMP_计数器;(唯一的区别是分号)编辑:忽略上面的内容,修复了这个问题。现在文件是空的。请尝试:
find-键入f-名称“prob[0-9]*.*”-exec echo{}>${tmpFile}\
您甚至不需要
-exec
查找-键入f-名称“prob[0-9]*.*”-打印>>$tmpFile
@glennjackman:同意,我不应该在那里使用exec。已编辑。@glennjackman:我甚至还删除了
-print
,因为默认情况下这是存在的。迭代
find
输出的安全方法是
find-在读取-r-d“DIR
时打印0,对“$DIR”/*
中的文件使用
。从
echo${FILE}>${tmpFile}
行中删除反勾号。
find . -regex ".*prob[0-9]*_.*" -printf '%f\n' >> ${tmpFile}