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

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

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

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}') 
  • «Обновляет» zip-файл с опцией -FS изменяет время модификации файла?
  • копировать файлы, измененные после определенной даты с помощью cp-переключателей
  • получить исходную дату создания html-файла
  • Кодирование видео с Unix Timestamps + ms
  • Ошибка rsync: значение времени файла, усеченного на приемнике
  • Полная дата файла (без утилит GNU)
  • Задача Cron для удаления файлов старше 3 дней
  • Найти изображения с одинаковой временной отметкой exif
  • Найти файлы между двумя папками в linux?
  • Нужно преобразовать столбец timestamp unix epoch в каждую строку с помощью sed или awk
  • Корреляция / var / log / * timestamps
  • Linux и Unix - лучшая ОС в мире.