2017-08-01 95 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 
相关问题