Введение
В этом проекте вы научитесь создавать пользовательскую команду ls, которая отображает размеры директорий в удобочитаемом формате. Этот проект поможет вам понять, как получать и форматировать информацию о файлах в среде Linux с использованием скриптов на Zsh.
👀 Предварительный просмотр
$ 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, который будет отображать размеры всех файлов и директорий в указанной директории. Следуйте шагам ниже, чтобы завершить этот шаг:
- Откройте текстовый редактор и создайте новый файл с именем
newls.shв директории/home/labex/project. - Добавьте следующую строку shebang в начало файла, чтобы указать, что это скрипт на 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 для получения подробной информации о файлах и директориях, затем обработайте вывод построчно
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)
## Преобразуйте ведущий ноль в месяце в десятичный формат
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. - Запустите скрипт
newls.shс директорией/home/labexв качестве аргумента:
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, чтобы улучшить свои навыки.



