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
削除されたシェルパターンに一致する最も長いプレフィックスに拡張される値*/complex
。
${pdb_name%.pdb}
pdb_name
削除されたシェルパターンに一致する最も短いサフィックスに拡張される値.pdb
。
あなたの場合、これは問題ではありませんが、base_name=$(basename "$path")
コマンドの置き換えのためにファイル名の末尾に改行文字を削除すると、望ましくない副作用が発生する可能性があることに注意してください。この点では、シェルパラメータの拡張がより安全です。