はじめに
このプロジェクトでは、ユーザーにとって分かりやすい形式でディレクトリのサイズを表示するカスタム ls コマンドを作成する方法を学びます。このプロジェクトは、Zsh スクリプトを使って Linux 環境でファイル情報を取得してフォーマットする方法を理解するのに役立ちます。
👀 プレビュー
$ sh newls.sh /home/labex
## 例
drwxr-xr-x 1 labex 6B Oct 13 10:11 Code
drwxr-xr-x 1 labex 120B Oct 13 10:11 Desktop
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Oct 23 10:17 project
🎯 タスク
このプロジェクトでは、以下のことを学びます。
- ファイルとディレクトリ情報を表示する Zsh スクリプトを作成する方法
- ファイルサイズを読みやすくするためにフォーマットする方法
- ファイルの変更日時に適切な日付形式を決定する方法
ls -lhコマンドと同じ形式でファイル情報を出力する方法
🏆 成果
このプロジェクトを完了すると、以下のことができるようになります。
- 指定されたディレクトリ内のファイルとディレクトリのサイズを表示できる Zsh スクリプトを書くこと
- ファイルサイズ情報を読みやすくするためにフォーマットすること
- 現在の年とファイルの最終変更日時に基づいて、ファイルの変更日時に適切な日付形式を決定すること
ls -lhコマンドと一致するユーザーにとって分かりやすい形式でファイル情報を出力すること
newls.sh スクリプトを作成する
このステップでは、指定されたディレクトリ内のすべてのファイルとディレクトリのサイズを表示する newls.sh スクリプトを作成します。このステップを完了するには、以下の手順に従ってください。
- テキストエディタを開き、
/home/labex/projectディレクトリにnewls.shという名前の新しいファイルを作成します。 - これが Zsh スクリプトであることを指定するために、ファイルの先頭に以下のシェバン行を追加します。
#!/bin/zsh
- スクリプトの先頭にコメントブロックを追加して、その目的を説明します。
## このスクリプトは、指定されたディレクトリからファイル情報を取得してフォーマットし、"ls -lh" コマンドと同じ形式で表示します。
- 次に、入力パラメータ(リスト表示するディレクトリ)が提供されているかどうかを確認するコードを追加します。提供されていない場合は、使用方法のメッセージを表示してスクリプトを終了します。
## 入力パラメータが空かどうかを確認する
if [ $## -eq 0 ]; then
echo "Usage: sh newls.sh <directory>"
exit 1
fi
- 次に、指定されたディレクトリが存在するかどうかを確認するコードを追加します。存在しない場合は、エラーメッセージを表示してスクリプトを終了します。
## ディレクトリが存在するかどうかを確認する
if [! -d "$1" ]; then
echo "Directory $1 does not exist."
exit 1
fi
ファイル情報を取得してフォーマットする
このステップでは、指定されたディレクトリからファイルとディレクトリの情報を取得し、ls -lh コマンドと同じ形式で出力をフォーマットするコードを追加します。このステップを完了するには、以下の手順に従ってください。
lsコマンドを使用して、指定されたディレクトリ内のファイルとディレクトリの詳細情報を取得し、出力をls_output変数に格納します。
## ls コマンドを使用してファイルとディレクトリの詳細情報を取得し、その後出力を 1 行ずつ処理する
ls_output=$(ls -l --time-style="+%b %d %Y %H:%M" "$1" | tail -n +2)
whileループを追加して、ls_outputの各行を処理して必要な情報を抽出します。
## ls 出力の各行を処理する
## 各行の末尾の空白を削除する
## 各行の各フィールドを解析する
- ファイルサイズを読みやすくするためにフォーマットするコードを追加します。
## ファイルサイズを読みやすくするためにフォーマットする
if [[ $size =~ ^[0-9]+$ ]]; then
## サイズが数字の場合、フォーマットする
if ((size < 1024)); then
size_formatted="${size}B"
elif ((size < 1024 ** 2)); then
size_formatted="$(printf "%.1f" $(echo "scale=2; $size / 1024" | bc))K"
elif ((size < 1024 ** 3)); then
size_formatted="$(printf "%.1f" $(echo "scale=2; $size / (1024**2)" | bc))M"
else
size_formatted="$(printf "%.1f" $(echo "scale=2; $size / (1024**3)" | bc))G"
fi
else
## サイズが数字として解析できない場合、そのままにする
size_formatted="$size"
fi
- ファイルの変更日時に基づいて適切な日付形式を決定するコードを追加します。
current_year=$(date +"%Y")
## 変更日付から年、月、日を抽出する
file_year=$(echo "$year" | cut -d' ' -f3)
file_month=$(echo "$month" | cut -d' ' -f1)
file_day=$(echo "$day" | cut -d' ' -f1)
## 月の先頭のゼロを 10 進数形式に変換する
file_month=$(echo "$file_month" | sed 's/^0//')
## ファイルの最終変更のタイムスタンプを取得する
file_modified=$(date -d "$month $day $year" +"%s")
## 6 ヶ月前のタイムスタンプを取得する
six_months_ago=$(date -d "6 months ago" +"%s")
## 現在の時刻とファイルの最終変更の秒数の差分を計算する
time_diff=$(($(date +"%s") - file_modified))
if ((file_year == current_year)); then
## ファイルの年が現在の年と同じ場合
if ((time_diff >= six_months_ago)); then
## 6 ヶ月以上前、完全な日付を表示する:月 日 年
formatted_date="$month $day $year"
else
## 過去 6 ヶ月以内、日付と時刻を表示する:月 日 HH:MM
formatted_date="$month $day $time"
fi
else
## ファイルの年が現在の年と異なる場合、完全な日付を表示する:月 日 年
formatted_date="$month $day $year"
fi
- 最後に、フォーマットされたファイル情報を出力するコードを追加します。
## 出力形式には条件に基づくカスタマイズされた日付フォーマットが含まれる
完全な newls.sh スクリプトができました。このファイルを保存して、次のステップに進むことができます。
newls.sh スクリプトをテストする
このステップでは、newls.sh スクリプトが期待通りに機能することを確認するためにテストします。このステップを完了するには、以下の手順に従ってください。
- ターミナルを開き、
/home/labex/projectディレクトリに移動します。 /home/labexディレクトリを引数としてnewls.shスクリプトを実行します。
sh newls.sh /home/labex
- 出力がチャレンジの説明に示されているような期待される形式と一致することを確認します。
drwxr-xr-x 1 labex 6B Oct 13 10:11 Code
drwxr-xr-x 1 labex 120B Oct 13 10:11 Desktop
drwxr-xr-x 1 labex 28B Sep 23 2021 golang
drwxr-xr-x 1 labex 22B Oct 23 10:17 project
- 出力が期待される形式と一致する場合、
newls.shスクリプトは正常に機能しています。一致しない場合は、スクリプトを見直して必要な修正を行ってください。
おめでとうございます!あなたは正常にこのプロジェクトを完了し、ユーザーにとって分かりやすい形式でディレクトリのサイズを表示するカスタム ls コマンドを作成しました。
まとめ
おめでとうございます!このプロジェクトを完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を行って練習することができます。



