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 またはコマンドプロンプトを管理者として実行します。