【问题标题】:Linux find script result not appending to the output text fileLinux查找脚本结果未附加到输出文本文件
【发布时间】:2018-06-14 04:37:21
【问题描述】:

我编写了一个小的 shell 脚本,用于识别我网站中的 PDF 文件关联页面。

将pdf源列表url逐一作为输入,在网站内容中递归查找。

问题是当我运行脚本查找结果未附加到输出文件时, 但是当我使用 find 命令并在终端/putty 中手动运行时可以看到结果。

脚本:

#!/bin/bash
filename="PDF_Search_File.txt"
while read -r line
do
        name="$line"
                echo "*******pdf******** - $name\n" >>output_pdf_new.txt
        find . -type f -exec grep -l "$name" '{}' \; >>output_pdf_new.txt
                echo "*******pdf******** - $name\n" >>output_pdf_new.txt
done < "$filename"

源列表 url 输入文件 (PDF_Search_File.txt)

/static/pdf/pdf1.pdf
/static/pdf/pdf2.pdf
/static/pdf/pdf3.pdf
--------------------

输出结果文件(output_pdf_new.txt)

./Search_pdf.sh
*******pdf******** - /static/pdf/pdf1.pdf\n
*******pdf******** - /static/pdf/pdf1.pdf\n
./Search_pdf.sh
*******pdf******** - /static/pdf/pdf2.pdf\n
*******pdf******** - /static/pdf/pdf2.pdf\n
./Search_pdf.sh
*******pdf******** - /static/pdf/pdf3.pdf\n
*******pdf******** - /static/pdf/pdf3.pdf\n
------------------------------------------

终端/putty 可以在手动运行查找时看到下面的结果。

find . -type f -exec grep -l "/static/pdf/pdf1.pdf" '{}' \;

./en/toyes/zzz/index.xhtml
./en/toyes/kkk/index.xhtml
--------------

但脚本有问题,只输出回显结果如上输出结果。

更新 当我用 bash -x 执行脚本时,它给出了以下结果

[user@server1 generated_content]# bash -x Search_pdf.sh
+ filename=PDF_Search_File.txt
+ read -r line
+ name=$'/static/pdf/pdf1.pdf\r'
\n'cho '*******pdf******** - /static/pdf/pdf1.pdf
+ find . -type f -exec grep -l $'/static/pdf/pdf1.pdf\r' '{}' ';'
\n'cho '*******pdf******** - /static/pdf/pdf1.pdf
+ read -r line
+ name=$'/static/pdf/pdf2.pdf\r'
\n'cho '*******pdf******** - /static/pdf/pdf2.pdf
+ find . -type f -exec grep -l $'/static/pdf/pdf2.pdf\r' '{}' ';'

这里有问题

  + find . -type f -exec grep -l $'/static/pdf/pdf2.pdf\r' '{}' ';'

find 命令应该是下面这样,但是在执行的时候就和上面一样了

find . -type f -exec grep -l "/static/pdf/pdf1.pdf" '{}' \;

【问题讨论】:

  • 运行脚本时和手动运行命令时是否在同一目录下?
  • 是的,我在同一个目录中。我也在同一位置运行脚本
  • set -x放在脚本的开头,这样你就可以看到所有正在执行的命令,也许你会在那里看到一些错误。
  • ls ./en/toyes/*/index.xhtml 放入脚本中。它显示了什么?
  • 停止使用 Windows 为 Unix 编辑文件。

标签: linux bash shell


【解决方案1】:

您是否尝试过 echo 中的 -e 选项来启用反斜杠转义的解释?

你为什么不干脆做find | grep

找到 ./ -type f | grep "$name" >> output_pdf_new.txt

尝试在查找中关注(./ 而不是 .

find ./ -type f -exec grep -l "$name" '{}' \; >>output_pdf_new.txt

【讨论】:

  • 回显结果没有任何问题,它附加到文件中,只找到没有附加到文件的结果。请告诉我我在哪里做错了
  • @chamara,用find | grep 建议编辑答案。
  • 没有上面的命令,不起作用兄弟,我只想在源代码中找到那些pdf链接的网站页面,然后输出应该是网站页面index.html url我的命令在什么时候成功运行我在腻子中手动测试,但我有巨大的 pdf 列表
  • find | grep 匹配文件名,他要匹配文件内容。
  • 啊,我明白你的意思了。你原来的 find 命令应该可以工作。
【解决方案2】:

grep -rl 用于 for 循环内的文件:

cd /www/webroot/
grep -rl "${name}" * | while read file_path; do
    # I need to do something with each file
    echo $file_path
done

或者我只需要将输出运行到文件

cd /www/webroot/
grep -rl "${name}" * >> output_pdf_new.txt

【讨论】:

  • 为什么需要while 循环?
  • 如果你只是回应它,你不需要处理循环。只需重定向grep -rl 的输出即可。
  • 这个问题是关于对输出做一些事情而不是仅仅回显它。
  • 正确。他们可以弄清楚如何处理我希望的回声 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2015-01-12
相关资源
最近更新 更多