2017-08-01 96 views
-1

可以簡化嗎?使用bash查找文件時提取文件名的一部分

find *.xml | sed -n "s/\(^.*\)\.xml/\1/p" 

目標是檢索xml文件的第一部分。 我剛剛注意到那裏有一個正則表達式重複,並認爲必須有一個簡化版本

+1

'ls * .xml |切-d。 -f1'(或'ls * .xml | rev | cut -d。-f2- | rev'如果名稱包含句點。) – Anubis

+0

@Anubis,請參閱[爲什麼不應該分析'ls'的輸出]( http://mywiki.wooledge.org/ParsingLs) –

+0

btw,'find * .xml'是(非常**非常**)越野車本身;不像'find。 -name'* .xml',它沒有正確遞歸。 –

回答

1

不,沒有簡化版本。 find是一個專門的工具 - 它不實現任意的文本處理支持。

專注於正確性的版本實際上是甚至更詳細,看起來像:

while IFS= read -r -d '' filename; do 
    base=${filename%.xml} 
    echo "Filename $filename without its extension is $base" # put your actual command here 
done < <(find . -name '*.xml' -print0) 

...使用NUL分隔流,而不是一個新行分隔的一個(這是容錯因爲文件名可以包含換行符),並使用parameter expansion僅從尾部位置進行修剪。

0

請在awk中嘗試以下內容,並告訴我這是否有幫助。

awk 'prev && FNR==1{close(prev);print prev} FNR==1{prev=FILENAME;sub(/\..*/,"",prev);} END{print prev}' *.xml 
相關問題