2017-09-02 34 views
1

我想在某些文件夾中的所有文件.odt遞歸,提取其文本內容,並從他們創造.txt文件(因此命名,因此A.odt - > A.TXT)grep的所有ODT文件和管他們odt2txt

問題是,除了一些小竅門,我並不擅長殼。

grep命令這是很容易:grep -r -i --include \*.odt .

odt2txt的手冊頁說,我需要指定--output=FILE

因此,對於一個文件,這將是odt2txt A.txt --output=A.txt

這就像一個魅力。但如何將這兩者結合?

我在這裏面臨着兩個問題,通常我會連鎖我的命令(再次,外殼小白)與管道,像這樣

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

但正如你所看到的,odt2txt想要的文件名作爲第一個參數,以及如何獲取名稱,而不需要使用odt2txt的擴展名?

我覺得我不在正確的軌道上。

回答

3

grep被用於查找匹配的文件中的行,但你似乎想要做的是找到名稱與特定patt匹配的文件ERN。爲此,可以使用find。另外,我假設odt2txt想要A.odt作爲第一個參數,而不是A.txt

我會用find找到這些文件,然後用它的-exec選項執行odt2txt。我會用basename去除.odt擴展名,然後我加.txt。所以,這樣的事情:

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

注意的-exec後,{}表示文件名,執行命令的結束由";"信號。

+0

輸出文件名中的路徑怎麼樣? 'basename'只傳遞沒有路徑的文件名。 – ideaboxer

+0

也是次要的事情是,文件將被稱爲.odt.txt之後,而不僅僅是.txt(但這根本不重要) – Sorona

+0

你說得對。反引號根本不起作用,因爲他們先找到了引號,然後才發現找到了。 – Abigail

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

下面會做:

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"' _ {} \; 
相關問題