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

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

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

  • Удаление файлов по годам
  • Найти файлы между двумя папками в linux?
  • Что вы можете сделать с файлом без запуска отметки «Изменить»?
  • Как скопировать 5 новейших файлов из одного каталога в другой и удалить старые копии
  • Как удалить файлы в одной папке, которая старше 60 дней в UNIX?
  • Заменить символ алфавитом в зависимости от позиции в строке
  • Как найти дату создания файла?
  • Что означает отметка времени «00:00:00» в kern.log?
  • 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}') 
    Interesting Posts

    удалить с начала файла до n-го вхождения шаблона

    Объединение двух файлов в столбцы

    Как я могу изменить яркость экрана в debian wheezy, установленном на ноутбуке?

    Доступ к записи запрещен при установке папки из гостевого дома qemu

    Какую программу я могу использовать для получения функций копирования / факса из отдельного сканера и принтера?

    Отключить обновление репозитория в Fedora

    Система загружается только с вставленным компакт-диском

    Добавление метки времени при перемещении файла в bash

    Чувствительность странного поведения к ситуации с bash на MacOS

    другой вопрос с сортировкой в ​​bash

    Как запустить демон SSH при загрузке в Linux Mint Debian v2

    Создание подписанного подчиненного ЦС для клиентских сертификатов

    Извлечь определенный раздел

    Каков прогресс в улучшении производительности системы / реагирования во время ввода / вывода с высоким диском?

    Удалите определенные объекты из плоской базы данных файлов

    Linux и Unix - лучшая ОС в мире.