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

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

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

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

Я хочу превратить

enter image description here

в:

enter image description here

22
задан 10 July 2012 в 05:15

3 ответа

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

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

0
ответ дан 10 July 2012 в 05:15

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

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

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

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

0
ответ дан 10 July 2012 в 05:15

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

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

или awk, как показано в @Corey answer , cut -c44-45 также будет работать после настройки (так как [ 115] имеет фиксированные столбцы), или что-то еще, однако основная проблема заключается в том, что он не будет надежным и пуленепробиваемым (например, в Unix это может быть $6, а не $7, и он меняется в зависимости от аргументов) не дружественный к машине, поэтому вообще не рекомендуется разбирать 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 [ 1112], так что он по-прежнему не будет пуленепробиваемым в разных операционных системах.

0
ответ дан 10 July 2012 в 05:15

Другие вопросы по тегам:

Похожие вопросы: