Моя цель обманчиво проста (по крайней мере, для меня). Я хочу взять выходные данные ls -l
или ls -lh
и выбрать только одно поле.
Я хочу, чтобы это было как можно более пуленепробиваемым, и я имею в виду, что имена файлов могут иметь переменное количество пробелов, не все в поле имеют одинаковую длину и т. Д.
Бонусные баллы за наличие сценария, который будет принимать имя поля (или даже просто номер поля), а затем возвращать содержимое поля.
Я хочу превратить
в:
Попробуйте ls -l | awk '{print $7}'
.
awk
выбирает столбцы, поэтому он идеально подходит для этой задачи.
Никогда не разбирайте ls . Используйте GNU find
. Или, если мобильность не важна, stat(1)
.
find . -maxdepth 1 -printf '%Td\n'
Для чтения данных, кроме списков имен файлов, построчно и разделения на поля, см .: BashFAQ / 001
Нет способов надежно прочитать новую строку -ограниченный список имен файлов, которые имеют смысл в большинстве случаев.
Вы можете получить определенный столбец в оболочке, например:
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], так что он по-прежнему не будет пуленепробиваемым в разных операционных системах.