![Bash:从文件名中删除多种模式](https://linux22.com/image/182118/Bash%EF%BC%9A%E4%BB%8E%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E5%88%A0%E9%99%A4%E5%A4%9A%E7%A7%8D%E6%A8%A1%E5%BC%8F.png)
通常,循环遍历我用来basename
提取文件名作为单独变量的文件:
# remove .pdb extension from filename in new variable and print name of the file without it
for pdb in "${storage}"/complex*.pdb ; do
pdb_name=$(basename "$pdb" .pdb)
echo this is "$pdb_name" without its extension!
done
如何使用相同的basename
表达式从每个文件中删除多个模式?例如,除了“.pdb”之外,我还想省略“complex”,它始终出现在每个文件的开头(这里我使用它作为循环中识别文件的模式)。
答案1
据我所知,basename
无法从路径的非目录部分删除前缀。我建议改用参数扩展功能:
shopt -s nullglob # Don't loop over the pattern if it matches nothing
for pdb in "$storage"/complex*.pdb
do
pdb_name=${pdb##*/complex}
pdb_name=${pdb_name%.pdb}
printf '%s\n' "$pdb_name"
done
${pdb##*/complex}
pdb
扩展为与已删除的 shell 模式匹配的最长前缀的值*/complex
。
${pdb_name%.pdb}
pdb_name
扩展为与删除的 shell 模式匹配的最短后缀的值.pdb
。
虽然这在您的情况下不是问题,但请注意,base_name=$(basename "$path")
删除文件名末尾的换行符(由于命令替换)可能是不需要的副作用。 Shell 参数扩展在这方面更安全。