我希望递归地获取某个文件夹中的所有.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使用扩展名。
我觉得我没有走上正确的轨道。
发布于 2017-09-02 18:53:10
grep用于查找文件中的匹配行,但您似乎只想找到名称与特定模式匹配的文件。为此,可以使用find。而且,我认为odt2txt希望A.odt作为第一个参数,而不是A.txt。
我将使用find查找文件,然后使用它的-exec选项来执行odt2txt。我会使用basename去掉.odt扩展,然后添加.txt。所以,就像这样:
find . -name '*.odt' -exec odt2txt {} --output=`basename {} .odt`.txt ";"注意,在-exec之后,{}表示文件名,要执行的命令的结尾由";"发出信号。
发布于 2017-09-02 18:49:16
使用find和while
find . -name "*.odt" | while read f
do
odt2txt "$f" --output="`dirname "$f"`/`basename -s ".odt" "$f"`.txt"
done龙舌兰人:
find . -name "*.odt" | while read f; do odt2txt "$f" --output="`dirname "$f"`/`basename -s ".odt" "$f"`.txt"; done发布于 2021-08-14 21:07:25
#/usr/bin/bash
for i in *.odt ; do ( if odt2txt $i| grep -i $1 ; then echo $i; fi; ) ;doneapt install odt2txt 别碰grep!
https://stackoverflow.com/questions/46017009
复制相似问题