Как выбрать поле / столбец из вывода 'ls -l'?

17

Моя цель обманчиво проста (по крайней мере для меня). Я хочу сделать вывод ls -l или ls -lh и выбрать только одно поле.

Я ищу, чтобы это было как можно более пуленепробито, под которым я подразумеваю, что имена файлов могут иметь переменное количество пробелов, а не все в поле имеют одинаковую длину и т. д.

Бонусные баллы за наличие сценария, который примет имя поля (или даже номер поля), а затем вернет содержимое поля.

Я хочу повернуть

в

    
задан soandos 10.07.2012 в 01:00
источник

3 ответа

31

Попробуйте ls -l | awk '{print }' .

awk выбирает столбцы, поэтому он идеально подходит для этой задачи.     

ответ дан Corey Whitaker 10.07.2012 в 01:04
источник
16

Никогда не разбирайте ls . Используйте GNU find . Или, если переносимость не важна, stat(1) .

find . -maxdepth 1 -printf '%Td\n'

Для чтения данных, отличных от списков имен файлов по строкам и разбиения на поля, см. BashFAQ / 001

Нет способов надежно читать список имен файлов, разделенных новой строкой, которые имеют смысл в большинстве случаев.

    
ответ дан ormaaj 10.07.2012 в 01:15
1

Вы можете получить конкретный столбец в оболочке, например:

ls -al | while read perm bsize user group size month day time file; do echo $day; done

или awk , как показано в ответе @Corey , cut -c44-45 также будет работать после настройки (поскольку ls имеет фиксированные столбцы) или что-то еще, однако главная проблема заключается в том, что он не будет надежным и пуленепробиваемым (например, в Unix он может быть , а не , и он изменяется в зависимости от аргументов) поэтому не рекомендуется полностью анализировать ls .

Лучше всего использовать разные доступные команды, такие как find или stat , которые могут предоставить соответствующие параметры для форматирования вывода по мере необходимости. Например:

$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt

Чтобы вернуть столбец только дней изменений, попробуйте этот пример:

stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done

Следует отметить, что GNU stat может иметь разные опции для BSD stat , поэтому он по-прежнему не будет пуленепробиваемым в разных операционных системах.

    
ответ дан kenorb 10.04.2016 в 04:27