我希望以递归方式获取某个文件夹中的所有.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
不使用扩展名?
我觉得我没有走上正轨。
答案 0 :(得分:3)
使用find
和while
:
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"' _ {} \;