2

我正在制作一个 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]*_ 描述的格式(类似于 prob12345_01)

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

4

3 回答 3

3

All this can be done in one single find command. Consider this:

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

EDIT:

Even simpler: (Thanks to @GlennJackman)

find . -type f -name "prob[0-9]*_*" >> $tmpFile
于 2012-04-24T19:32:18.230 回答
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'文件名,以匹配您的脚本正在执行的操作。

于 2012-04-24T19:42:32.703 回答
1

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

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,一个人可以做到这一点,
阿努巴瓦把我带到了那里;)
所以看看他的回答是如何做到的

于 2012-04-24T19:31:28.430 回答