【问题标题】:grep all odt files and pipe them to odt2txtgrep 所有 odt 文件并将它们通过管道传输到 odt2txt
【发布时间】:2017-09-02 18:34:32
【问题描述】:

我想递归地获取某个文件夹中的所有 .odt 文件,提取它们的文本内容并从中创建 .txt 文件(相应命名,因此 A.odt -> A.txt)

问题是,除了一些技巧,我对 shell 并不擅长。

grep 很简单:grep -r -i --include \*.odt .

odt2txt 的手册页说,我需要指定--output=FILE

所以对于一个文件,它将是odt2txt A.txt --output=A.txt

这就像一个魅力。但是如何将这两者结合起来呢?

我在这里遇到两个问题,通常我会用管道链接我的命令(再次,shell noob),就像这样

grep -r -i --include \*.odt . | odt2txt $INPUT_FROM_GREP --output=$MISSING_NAME

但是正如你所看到的,odt2txt 想要文件名作为第一个参数,以及如何获取文件名,而没有odt2txt 使用的扩展名?

我觉得我没有走上正轨。

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    grep 用于查找文件中的匹配行,但您似乎想要做的只是查找名称与特定模式匹配的文件。为此,可以使用find。另外,我假设odt2txt 想要A.odt 作为第一个参数,而不是A.txt

    我会使用find 来查找文件,然后使用它的-exec 选项来执行odt2txt。我会使用basename 去除.odt 扩展名,然后添加.txt。所以,是这样的:

    find . -name '*.odt' -exec odt2txt {} --output=`basename {} .odt`.txt ";"
    

    请注意,-exec 之后,{} 表示文件名,要执行的命令结束由";" 表示。

    【讨论】:

    • 输出文件名中的路径呢? basename 只传递不带路径的文件名。
    • 还有一个小问题是文件之后会被称为 .odt.txt,而不仅仅是 .txt(但这根本不重要)
    • 它也不是递归的,但很容易添加:)
    • find 是递归的。
    • 我的错……不过速度太快了,oO 转换了数百个(更大的)文本
    【解决方案2】:

    使用findwhile

    find . -name "*.odt" | while read f
    do
      odt2txt "$f" --output="`dirname "$f"`/`basename -s ".odt" "$f"`.txt"
    done
    

    Oneliner:

    find . -name "*.odt" | while read f; do odt2txt "$f" --output="`dirname "$f"`/`basename -s ".odt" "$f"`.txt"; done
    

    【讨论】:

      【解决方案3】:
      #/usr/bin/bash
      for i in *.odt ; do ( if odt2txt $i| grep -i $1 ;  then echo $i; fi; ) ;done
      
      apt install odt2txt 
      

      别管 grep!

      【讨论】:

        【解决方案4】:

        下面会做:

        function odt2txtfun
        {
        outfilename=${1##*/}
        outfilename=${outfilename%.odt}.txt
        odt2txt "$1" --output="/path/to/output/folder/${outfilename}"
        }
        export -f odt2txtfun
        find /folder/that/contains/odt/files -name *.odt" -exec bash -c 'odt2txtfun "$1"' _ {} \;
        

        【讨论】:

          猜你喜欢
          • 2011-01-03
          • 2011-07-17
          • 2016-06-11
          • 1970-01-01
          • 2021-02-17
          • 1970-01-01
          • 2019-01-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多