シェルスクリプトから拡張子なしでファイル名を抽出する

シェルスクリプトから拡張子なしでファイル名を抽出する

重複の可能性:
文字列からファイル拡張子を削除する最良の方法は何ですか?
拡張子を削除して複数のファイルの名前を変更するには?

データベースにロードしたい.txtファイルがたくさんあります。

これらのテーブルは.txtファイルと同じ名前ですが、拡張子はありません。

だからコマンドを実行したい

for f in *.txt; do mysql -u root -p -e "LOAD DATA LOCAL INFILE '$f' INTO TABLE $f" -D rn4; done

しかし最後は、$f拡張子ではなく名前だけを使用したいので、頭が痛い。

したがって、ファイルの場合、piRNA.txtコマンドは次のようになります。

mysql -u root -p -e "LOAD DATA LOCAL INFILE 'piRNA.txt' INTO TABLE piRNA" -D rn4

どうすればいいですか?

答えが他の人に役立つように、ただコマンドだけを与えないでください。

答え1

シェルスクリプトでこれを行うことができます。

f=piRNA.txt
g=${f%.txt}

実行中

 echo $f $g

次の出力が生成されます。

piRNA.txt piRNA

この%構文を使用すると、一致するサフィックスパターンを削除できます。例のサフィックスパターン.txtf削除された変数です。パターンにはワイルドカードを含めることもできます(例:バッシュマニュアル詳細はこちら)。

いつものように、ファイル名にスペースを含めることができる場合は、変数への参照を二重引用符(たとえば"$f"など)で囲む必要があります。

答え2

この試み:

for f in *.txt; do echo ${f%.*};done
  • 使用パターンマッチング *.txt次に終わるすべてのファイルと一致します。.txt
  • ${f%.*}シェル構文は次のとおりです。パラメータ拡張、パターンに一致する最小のサフィックスを削除します$f。ここでは拡張部分を削除します.txt

関連情報