我正在制作一个抓取目录的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,这是我想要避免的。我认为这是一个简单的修复,但它正在逃避我。
答案 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让我在那里;)
所以看看他的答案是如何完成的