Bash を使用してファイル拡張子を削除する
このチュートリアルでは、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
)が最初に検出される前にすべてを出力します。
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn