grep所有odt文件并将它们传递给odt2txt

时间:2017-09-02 18:34:32

标签: bash shell

我希望以递归方式获取某个文件夹中的所有.odt个文件,提取其文本内容并从中创建.txt个文件(相应地命名,因此A.odt - &gt; A.txt)< / p>

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

grep for this很简单: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不使用扩展名?

我觉得我没有走上正轨。

3 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:3)

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

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

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

请注意,在-exec之后,{}表示文件名,并且要执行的命令的结尾由";"发出信号。

答案 2 :(得分:1)

下面会这样做:

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"' _ {} \;