Bash を使用してファイル名と拡張子を取得する

Ozair Malik 2023年1月30日
  1. Bash を使用してファイル名と拡張子を取得する
  2. Bash ファイルを実行してファイル名と拡張子を取得する
  3. 許可関連の問題
Bash を使用してファイル名と拡張子を取得する

Bash スクリプトは、日常の Linux 管理タスクであれ、DevOps 自動化タスク全体であれ、近年非常に人気があります。

bash スクリプトでファイル名とその拡張子を別々に抽出したい状況にいると仮定します。たとえば、server.py という名前の Python ファイルがあります。名前 server と拡張子 py を分離して、この文字列を 2つの部分に分割します。

Bash を使用してファイル名と拡張子を取得する

デモンストレーション用に bash スクリプトを作成しました。必要に応じて、スクリプトのどこでもこのコードを使用できます。

  • まず、ユーザーが適切な引数を指定したかどうかを確認します。次のコードスニペットは、if ステートメントが = からゼロ 0 に等しくなることを使用しています。これは、引数が提供されていないことを意味します。その場合、デフォルトの引数として pwd または現在の作業ディレクトリを使用します。
#!/bin/bash

# Checking if arguments have been provided:
if [[ $# == 0 ]]; then
    cDir=$(pwd) # Setting the cDir variable to current directory
    echo "[-] No directory provided!"
else
    cDir=$1

fi
echo "[+] Setting the directory to $cDir"
  • 次に、ユーザーから提供されたディレクトリが存在するかどうかを確認します。存在しない場合は、script.e を終了します。
# Checking if the directory exists:
if [[ ! -d $cDir ]]; then
    echo "[-] Directory $cDir doesn't exist!"
    exit
fi
  • ここで、Linux および Windows オペレーティングシステムの PowerShell で実行される単純な ls コマンドを使用して、ディレクトリ(もちろん、有効な場合)の allFile 変数で使用可能なファイルの抽出を開始します。
# Main extraction:
allFile=`ls $cDir`
echo;

ここでは、指定されたパスの最後の値が/でないかどうかを確認し、そうでない場合は、エラーを回避するために最後に追加します。

# Checking if the last value of the path is '/' or not:
if [[ ${cDir: -1} != '/' ]]; then
    cDir+='/'
fi
  • 次に、for loop と変数 $allFile を使用して、フォルダーに存在するすべてのものを繰り返し処理します。以前から、$allFile の値は ls $cDir であることを思い出してください。
# Iterating over everything in the folder
for item in $allFile; do
    # Appending path to each file:
    item="$cDir$item"

ループ内の -f フラグを使用して、検出されたファイルがタイプファイルであるかどうかを確認します。その場合は、ファイル名からドット部分(拡張子部分など)を削除します。

  • 最後に、echo を使用して希望の方法で結果を出力します。
# Checking if current item is a file:
if [[ -f $item ]]; then
	ext=`ls $item | rev | cut -d '.' -f 1 | rev`
	file_name=`ls $item | rev | cut -d '.' -f 2 | rev`
	echo "File Name: $file_name -> Extension: $ext"
fi
  • このスクリプトは、特定のディレクトリが存在するかどうかを確認します。また、ディレクトリが存在する場合は、すべてのファイルとその拡張子が記載されます。
┌─[root@parrot][/home/user/Downloads]
└──╼ #./test2.sh
[-] No directory provided!
[+] Setting the directory to /home/user/Downloads

File Name: /home/user/Downloads/ExtraCredit_Sockets_Intro -> Extension: pdf
File Name: /home/user/Downloads/project -> Extension: sh
File Name: /home/user/Downloads/test2 -> Extension: sh
File Name: /home/user/Downloads/test -> Extension: txt
引数としてディレクトリを指定せずにスクリプトを実行するため、ダウンロード、つまり現在のディレクトリがデフォルトと見なされ、そのディレクトリに存在するすべてのファイル名とその拡張子が示されます。

コードの各行にはコメントが付いているので、混乱があればチェックできます。

スクリプトを使用する場合は、こちらがフルバージョンです。

#!/bin/bash

# Checking if arguments have been provided:
if [[ $# == 0 ]]; then
	cDir=$(pwd) # Setting the cDir variable to current directory
	echo "[-] No directory provided!"
else
	cDir=$1
fi
echo "[+] Setting the directory to $cDir"

# Checking if the directory exists:
if [[ ! -d $cDir ]]; then
	echo "[-] Directory $cDir doesn't exist!"
	exit
fi

# Main extraction:
allFile=`ls $cDir`
echo;

# Checking if the last value of the path is '/' or not:
if [[ ${cDir: -1} != '/' ]]; then
	cDir+='/'
fi

# Iterating over everything in the folder
for item in $allFile; do
	# Appending path to each file:
	item="$cDir$item"
	# Checking if current item is a file:
	if [[ -f $item ]]; then
		ext=`ls $item | rev | cut -d '.' -f 1 | rev`
		file_name=`ls $item | rev | cut -d '.' -f 2 | rev`
		echo "File Name: $file_name -> Extension: $ext"
	fi
done

Bash ファイルを実行してファイル名と拡張子を取得する

Bash を学ぼうとしている初心者で、実行方法がわからない場合は、このコードを使用してください。.sh 拡張子の付いたファイルを作成するだけです。つまり、bash ファイルです。

その後、選択したターミナルを使用してそのディレクトリに移動し、./filename と入力すると、ファイルが実行されます。

Windows オペレーティングシステムを使用している場合は、bash file.sh と入力すると、問題なく実行されます。

ケースでは、スクリプトの正しいファイル名を使用することを忘れないでください。

許可関連の問題

スクリプトの実行中に、Permission Denied エラーが発生する可能性があります。

ターミナルで chmod + x [ファイル名] を使用して適切な権限を提供する必要があります。

Windows を使用している場合は、権限関連の問題を回避するために、PowerShell またはコマンドプロンプトを管理者として実行します。

関連記事 - Bash File