Настройка списка файлов Linux

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь создавать пользовательскую команду 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, который будет отображать размеры всех файлов и директорий в указанной директории. Следуйте шагам ниже, чтобы завершить этот шаг:

  1. Откройте текстовый редактор и создайте новый файл с именем newls.sh в директории /home/labex/project.
  2. Добавьте следующую строку shebang в начало файла, чтобы указать, что это скрипт на Zsh:
#!/bin/zsh
  1. Добавьте блок комментариев в начало скрипта, чтобы объяснить его назначение:
## Этот скрипт получает и форматирует информацию о файлах из указанной директории, отображает ее в том же формате, что и команда "ls -lh".
  1. Теперь добавьте код для проверки, был ли указан входной параметр (директория для перечисления). Если нет, выведите сообщение о использовании и выйдите из скрипта:
## Проверьте, пустой ли входной параметр
if [ $## -eq 0 ]; then
  echo "Usage: sh newls.sh <directory>"
  exit 1
fi
  1. Далее добавьте код для проверки, существует ли указанная директория. Если нет, выведите сообщение об ошибке и выйдите из скрипта:
## Проверьте, существует ли директория
if [! -d "$1" ]; then
  echo "Directory $1 does not exist."
  exit 1
fi

Получите и отформатируйте информацию о файлах

В этом шаге вы добавите код для получения информации о файлах и директориях из указанной директории и форматирования вывода в том же формате, что и команда ls -lh. Следуйте шагам ниже, чтобы завершить этот шаг:

  1. Используйте команду ls, чтобы получить подробную информацию о файлах и директориях в указанной директории, и сохраните вывод в переменную ls_output:
## Используйте команду ls для получения подробной информации о файлах и директориях, затем обработайте вывод построчно
ls_output=$(ls -l --time-style="+%b %d %Y %H:%M" "$1" | tail -n +2)
  1. Добавьте цикл while, чтобы обработать каждую строку ls_output и извлечь необходимую информацию:
## Обработайте каждую строку вывода ls
## Удалите конечный пробел из каждой строки

## Разберите каждый столбец строки
  1. Добавьте код для форматирования размера файла для лучшей читаемости:
## Форматируйте размер файла для лучшей читаемости
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
  1. Добавьте код для определения подходящего формата даты на основе времени модификации файла:
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
  1. Наконец, добавьте код для вывода отформатированной информации о файлах:
## Формат вывода включает настраиваемую форматирование даты в зависимости от условия

Теперь готов полный скрипт newls.sh. Вы можете сохранить файл и перейти к следующему шагу.

Протестируйте скрипт newls.sh

В этом шаге вы протестируете скрипт newls.sh, чтобы убедиться, что он работает как ожидается. Следуйте шагам ниже, чтобы завершить этот шаг:

  1. Откройте терминал и перейдите в директорию /home/labex/project.
  2. Запустите скрипт newls.sh с директорией /home/labex в качестве аргумента:
sh newls.sh /home/labex
  1. Проверьте, совпадает ли вывод с ожидаемым форматом, как показано в описании задачи:
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
  1. Если вывод совпадает с ожидаемым форматом, ваш скрипт newls.sh работает правильно. Если нет, проверьте скрипт и внесите необходимые исправления.

Поздравляем! Вы успешно завершили проект и создали пользовательскую команду ls, которая отображает размеры директорий в удобочитаемом формате.

✨ Проверить решение и практиковаться

Резюме

Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.