Информация о списке о файлах/каталогах с пробелами

Как я понимаю от примера, Вы хотите распечатать строки и после того номера строки.

Для печати номера строки и затем строк можно использовать cat или nl:

$ cat -n test.txt 
     1  text example
     2  text example
     3  text example
     4  text example

$ nl test.txt 
     1  text example
     2  text example
     3  text example
     4  text example

Но нет никакой возможности распечатать числа после строк в cat и nl таким образом, можно использовать awk:

$ awk '{print $0 "\t" NR}' test.txt 
text example    1
text example    2
text example    3
text example    4
1
10.10.2012, 10:23
2 ответа

Проблема состоит в том, что awk анализирует вход с пробелом как разделители полей. Это делает для проблемы, когда у Вас есть пробел как часть поля.

Вместо того, чтобы анализировать вывод ls, можно использовать stat(1) получить то, что Вы хотите наряду с опцией оболочки удара "dotglob".

shopt -s dotglob  # Enable * to match files starting with a dot
stat -c $'%A\t%U\t%s\t%Y\t%n' *

Строка формата производит поля, которые Вы хотели в формате, который Вы хотели. Использование $ '...' позволяет \t быть расширенным до вкладки. Вы могли вставить фактический символ табуляции и отбросить ведущий $, если бы Вы хотели.

Читайте bash(1) страница справочника для получения дополнительной информации о dotglob, и обращает внимание на GLOBIGNORE. Читайте stat(1) страница справочника для того, что можно вставить строку формата.

4
27.01.2020, 23:17
  • 1
    , Это работает замечательно! Я не знал stat. Мне нравится способность указать другие параметры или параметр в другом формате как этот. Информация GLIBIGNORE была также полезна.Спасибо! –  Rich 10.10.2012, 11:28

Как уже упомянуто, анализируя ls лучший способ не состоит в том, чтобы распечатать содержание каталога. Вы проблема можете быть легко решены, как бы то ни было.

Поскольку файл/имя каталога всегда является последним столбцом (или столбцами), вместо того, чтобы печатать 7$, можно распечатать от 7$ для длительности столбца. Можно сделать это с:

substr($0, index($0, $7))

Таким образом, Ваша полная команда была бы:

ls -al --time-style=+%s . | awk '{if ($7 != ".." && $7 != "." && $1 != "total") print $1"\t"$3"\t"$5"\t"$6"\t" substr($0,index($0,$7));}'

Также отметьте ту проверку если $1 != "total" не действительно хорошая идея, так как она не будет работать над локализованными системами (где total может быть другое слово). Я предлагаю использовать NF>6 для обеспечения у Вас есть достаточно столбцов.

1
27.01.2020, 23:17
  • 1
    Устранить total строка, пропустите строку 1: … && NR != 1 –  Gilles 'SO- stop being evil' 11.10.2012, 01:21
  • 2
    Спасибо за то, что сообщили мне, как сделать это с моим старым путем. Я переключился на использование stat, но для меня было хорошо видеть способ сделать это с awk. Я все еще узнаю о вещах как awk, так substr метод и вещь NF было полезно. –  Rich 11.10.2012, 02:56

Теги

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