Как извлечь длинное поле для листинга?

Я хочу извлечь день доступа файла в сценарий оболочки. Я попытался написать следующий скрипт, но он не работает. Когда я возвращаюсь к выходным дням , вывод «штат».

file=$1 accessday=$(ls -lu $file | cut -d ' ' -f 6) 

  • Как я могу увидеть историческое время изменения файла?
  • logfiles и летнее время
  • Список файлов с момента времени X до времени Y
  • цитаты внутри backticks внутри цитат в ksh
  • разница во времени между двумя датами ISO8601 с дробной второй частью
  • Unix-эпоха в миллисекундах
  • Странное форматирование даты в сценарии bash
  • Удалить последний измененный файл
  • 4 Solutions collect form web for “Как извлечь длинное поле для листинга?”

    Не разбирайте ls .

    Это работа для stat .

    Чтобы получить последнее время доступа в человекообразном формате:

     stat -c '%x' file.txt 

    в секундах с эпохи:

     stat -c '%X' file.txt 

    Если вы посмотрите на типичный выход ls -lu ,

     -rw-r--r-- 1 someuser somegroup 74 Mar 29 05:21 filename 

    вы заметите, что перед именем группы предшествует всего пять пробелов. Таким образом, ваша спецификация поля 6 в команде cut возвращает группу («штат» в вашем случае).

    Кроме того, день доступа будет полем 7, а не 6 в вашей нотации.

    Одним из решений было бы использовать awk , поскольку он обрабатывает множественные вхождения разделителя полей так, как вы ожидали по умолчанию:

     accessday=$(ls -lu $file | awk '{print $7}') 

    Основываясь на вашем вопросе, я бы использовал stat для нормализации вывода, а затем разрезал, чтобы отображать только ту дату, которую вы хотели.

    stat -c '%x' FILENAME | cut -c 9,10

    Анализ вывода ls затруднен и не всегда возможен . Если вы хотите извлечь временную метку, это иногда является необходимым резервом (это единственный переносимый способ сделать это: не все системы имеют команду stat ), но вы получаете удобочитаемую по времени метку времени, которую трудно преобразовать в машину, читаемый . По крайней мере, устраните трудные части: передайте опции -o и -g , чтобы опустить поля пользователя и группы (они могут содержать пробелы на некоторых системах, что делает невозможным разграничение вывода ls ). Затем метка времени занимает поля 4-6 (нумерация от 1).

    Не забывайте двойные кавычки вокруг переменных разложений .

     access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}') 

    Если вы хотите день месяца, вам нужно различать два формата вывода, для временных меток за последние 6 месяцев или нет. Установите языковой стандарт на C, чтобы получить надежный формат вывода. В этом формате день месяца всегда является вторым временным полем.

     access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}') 
    Linux и Unix - лучшая ОС в мире.