Linuxのbasenameコマンドは、ファイルパスの最後のコンポーネントを出力します。これは、長いファイルパスからファイル名を抽出するbashスクリプトで特に役立ちます。
いくつか例を挙げてお見せしましょう。
basenameコマンドには2種類の構文があります。最初のものには接尾辞が含まれます:
basename PATH [suffix]
2つ目は、オプションを追加できます:
basename OPTION PATH
オプションをサフィックスと組み合わせることはできません。まだ混乱しないでください。例に従うと、私が言いたいことが理解できます。
ファイルパスでbasenameコマンドを使用すると、ファイル名がわかります:
basename /home/user/data/filename.txt
filename.txt
basenameコマンドは実際にはかなりばかげています。実際にはファイルパスを認識しません。スラッシュ(/)を探し、最後のスラッシュの後にあるものをすべて出力します。
たとえば、ファイル名を削除して上記の例を実行すると、次のようになります。
basename /home/user/data
data
bashコマンドの主な用途は、ファイルパスからファイル名を抽出することです。ファイル名の抽出中にファイル拡張子を削除することもできます。
出力の最後から削除したいものを記述してください。たとえば、filename.txtから.txtを削除するとします。 basenameコマンドの最後に追加するだけです:
basename /home/user/data/filename.txt .txt
filename
接尾辞に-sオプションを使用することもできます:
basename -s .txt /home/user/data/filename.txt
filename
接尾辞は、入力の最後のコンポーネントの末尾から削除されます。ファイルの拡張子は実際にはわかりません。 .txtの代わりにtxt(ドットなし)を指定すると、「ファイル名」(末尾にドットが付いたもの)が表示されます。
また、コンポーネントの最後にないサフィックスを指定すると、サフィックスがないかのように出力が残ります。
basename /home/user/data/filename.txt name
filename.txt
オプション-a
、複数のパスを同時に使用できます。
basename -a /home/user/data/filename1.txt /home/user/data/filename2.txt
filename1.txt
filename2.txt
サフィックスオプション-s
を使用できます -a
を使用 ただし、いくつかの制限があります。すべてのファイルパスに指定できるサフィックスは1つだけです。
basename -as .txt /home/user/data/filename1.txt /home/user/data/filename2.txt
filename1
filename2
個別に割り当てることはできません。動作しません。
-z
を使用して、改行の代わりにNULLで出力を区切ることもできます。 オプション。
bashスクリプトでのベース名の使用
basenameコマンドの例をいくつか示しました。 bashスクリプトのbasenameの例をいくつか見てみましょう。
ファイルパス変数があり、パスからのファイル名を変数に格納するとします。これは単純なスクリプトである可能性があります:
pathname="/home/dir/data/filename"
result=$(basename "$pathname")
echo $result
もう1つの例は、ファイル拡張子の名前を変更する場合です。もちろん、renameコマンドを使用してファイルの名前を一括で変更することもできますが、これは単なる例です。
そこで、ファイル拡張子を置き換える目的でこのサンプルスクリプトを作成しました:
for file in *$1; do
if [ -f $file ]; then
mv $file `basename $file .$1`.$2
fi
done
一致するディレクトリが変更されないように、bashスクリプトでファイルかどうかを確認したことに気づきましたか?
上記のスクリプトは次のように使用できます:
./myscript.sh html htm
また、現在のディレクトリ内のすべてのファイルの名前を、末尾にhtmlを付けてhtmに変更します。
これらはほんの一例です。要件に応じて使用できます。
basenameコマンドはdirnameコマンドで補完されます。 basenameとは異なり、dirnameコマンドは、最後のコンポーネントを除くすべてのパスを出力します。
このチュートリアルが気に入っていただけたでしょうか。いつものように、コメントセクションで質問したり提案したりしてください。