HOWTO · Bash

Bash を使用してファイル拡張子を削除する

シェルスクリプトを使用した cut コマンドを使用してファイル拡張子を削除するためのステップバイステップガイドと、パイプと組み合わせた使用。

このページの内容

このチュートリアルでは、cut コマンドと basename bash コマンドを使用して bash スクリプトを使用して、ファイルの特定のフィールドを切り取って表示する方法について説明します。また、パイプと組み合わせて使用​​することもできます。次に、ファイル名から拡張子を切り取るときに発生する可能性のあるいくつかの問題が表示されます。

また、ファイル名からファイル拡張子をトリミングし、そのファイル名の語幹バージョンのみを表示する複数の実例を見て​​いきます。

cut メソッドを使用して、Bash のファイル拡張子を削除する

cut メソッドは、各行からファイルの特定のセクションをトリミングするために使用されます。このコマンドは、引数としてファイル名とオプション(必須)を取り、結果を標準コンソールに出力します。これを使用して、ファイル名拡張子を削除することもできます。このため、ファイル名とともに -f オプションが使用されます。利用可能なオプションのいくつかの簡単な説明は次のとおりです。

  • -b(バイト):このオプションは、指定されたバイト数の後のすべての行からテキストの一部をトリミングします。
  • -c(列):ファイルから特定の列または列の範囲を切り取り、残りを consol に表示するために使用されます。
  • -f(フィールド):2つの区切り記号(最初の記号を除く)の間の記号の集合は、フィールドと呼ばれます。ファイルの各行について、-f は、フィールドまたは整数フィールド番号を使用して言及された行の一部のみを表示します。タブはデフォルトで区切り文字と見なされます。ただし、-d フラグを使用して、ユーザー定義の区切り記号を定義できます。-f および d オプションを使用した cut コマンドの概要は次のとおりです。
$ cut -f (comma separated field numbers) -d "delimiting symbol" filename.txt 

-complement-output-delimiter-version などの他のオプションも利用できます。詳細については、cut --help を使用してサポートを受けることができます。

例 1:コンテンツから拡張機能を削除する

-f-d の詳細については、次の例を検討してください。webpages.txt には、特定の Web サイトのさまざまな HTMLWeb ページの名前がそれぞれ新しい行に含まれていると想定します。ターミナルで cat コマンドを実行して、webpages.txt の内容を見てみましょう。-

$ cat webpages.txt
index.html
contact_us.html
login.html
dashboard.html

次の bash スクリプトは、webpages.txt 内のすべてのファイル名から拡張子を切り取り、標準コンソールに出力を表示します。script という名前のシェルスクリプトファイルを作成し、その中に次のコードを記述したと仮定します。

#!/bin/sh
#script file
file=webpages.txt
cut -f 1 -d '.' $file

ここで、-f の前の 1 は、最初のフィールドのみを保持するために使用され、 -d オプションは、. を使用してフィールドを区切ることを示します。シンボル。したがって、スクリプトは、最初の . の前に webpages.txt の各行のすべてのテキストを保持します。出会い。出力を見てみましょう。

出力:

index
contact_us
login
dashboard

ここで、フィールド番号を 2 に設定すると、各行の画面に 2 番目のフィールド(つまり、HTML)のみが出力されます。

例 2:パイプを使用して変数に格納されているファイル名から拡張子を削除し、コンソールに表示する

変数に格納されているファイル名から拡張子を削除するとします。次のコードはそれを行います:-

file=webpages.txt
echo "$file" | cut -f 1 -d '.'

出力:

webpages

上記のコードは、file 変数に格納されているファイル名を cut コマンドにパイプします。このコマンドは、テキストの最初のフィールドのみを保持します。

例 3:パイプを使用して変数に格納されているファイル名から拡張子を削除し、それを別の変数に割り当てる

file=webpages.txt
trimmed=$(echo "$filename" | cut -f 1 -d '.')
echo "$trimmed"

出力

webpages

上記のコードは、コマンドの場所でコマンドの出力を置き換えるためにコマンド置換方法を使用しています。したがって、割り当て出力の右側に関係なく、トリミングが割り当てられます。

Bash でファイル拡張子を削除する際の問題

ファイル名に区切り文字自体がファイル名に含まれている場合、上記の定式化では、区切り文字が最初に検出される前にのみテキストが返されます。名前を逆にカットすることで、この問題を解決できます。

次のコードを見てみましょう。

file=abcd.efg.hmtl
trimmed=$(echo "$filename" | cut -f 2- -d '.')
echo "$trimmed"

出力:

abcd

上記のコードでは、file 変数の割り当てられた値にもう 1つのドットがあります。出力には、最初のドットの検出で終了する最初のフィールドのすべてのテキストが含まれます。

解決策:cut コマンドにパイプする前に、file の内容を逆にすることができます。その後、cut コマンドは、反転されたテキストの最初のフィールドを除くすべてのフィールドを保持します。さて、最終的な答えを得るには、もう一度逆にする必要があります。

file=abcd.efg.html
trimmed=$(echo "$file" | rev | cut -f 2- -d '.' | rev)
echo "$trimmed"

出力:

abcd.efg.html

f オプションの値の変更に注意してください。オプション -f 2- は、位置の値が 2 以上のすべてのフィールドを保持するために使用されます。

Bash の basename コマンドを使用してファイル拡張子を削除する

拡張機能の名前がわかっている場合は、basename コマンドを使用してファイル名から拡張機能を削除できます。

file=abcd.abc.html
trimmed=$(basename $file .html)
echo "$trimmed"

出力

abcd.abc

basename コマンドの最初のコマンドライン引数は変数の名前であり、拡張子名は 2 番目の引数です。basename コマンドはテキストをスキャンし、拡張子名(この場合は .html)が最初に検出される前にすべてを出力します。