Действительно ли возможно перечислить только имя файла и размер для каждого файла в каталоге с помощью только опции, найденные в ls утилите?

Предположим, что мой каталог 'Historic_Documents' имеет следующие файлы/размеры: 'Declaration_of_Independence.txt' 342 байта, 'Magna_Carta.txt' 1 580 байтов и 'Treaty_of_Versaille.txt' 752 байта. Это - возможное использование только ls опции получить следующий вывод?

342 Declaration_of_Independence.txt
1580 Magna_Carta.txt
752 Treaty_of_Versaille.txt
6
задан 31 October 2019 в 20:05

7 ответов

Как проанализировать вывод от ls -l полная распечатка с некоторое время циклом:
Я посмотрел на этот вопрос и думал хорошо, что это - что-то, что можно сделать довольно легко с находкой:

$ find -maxdepth 1 -type f -printf '%s %f\n'

Или

#!/bin/bash
for i in *; do
    stat --format '%s %N' "$i"
done

(%N будет соблюдать переменную среды QUOTING_STYLE; значение по умолчанию является 'Escape оболочки').

Только способ получить размер от ls посредством полной распечатки. При помощи read читать ls вывод; продвижение и конечные пробелы будут удалены из слова, прежде чем присвоено переменной, первое слово присвоено первой переменной и так далее, когда все переменные будут присвоены, остающиеся слова будут добавлены к последней переменной, тот способ, которым мы можем сохранить пробелы на имени файла.

#!/bin/bash
while read -r p c u g s e n; do
    [[ $p = total ]] && continue || { echo -n "$s "; eval "ls -d $n"; }
done < <(ls -Lpl --time-style=+%s --quoting-style=shell-escape)

(использование echo -n "$s "; eval "ls -d $n" является немного чрезмерным, но это показывает, как использовать 'Escape оболочки' с другими командами. Если Вы просто хотите показать вывод для размера и имени, использовать echo "$s $n" вместо этого)

переменные чтения:

-rwxr-xr-x 1 bac0n bac0n 209 1572207800 script.sh
     ^     ^   ^     ^    ^      ^         ^
     p     c   u     g    s      e         n

опции ls:

  • -L при проявлении информации о файле для символьной ссылки покажите информацию для файла ссылки ссылки, а не для самой ссылки.
  • -p добавьте / индикатор к каталогам.
  • -l используйте длинный формат списка.
  • --time-style время/формат даты с-l; это - хорошая практика для установки этого на эпоху в сценариях.
  • --quoting-style заключение в кавычки непечатаемых символов с помощью POSIX предложило ‘$ ''’ синтаксис.

тестовый каталог:

$ ls
a  'b'$'\r''c'   'd'$'\n''e'  "f'g"   h,i  'j k'  'l  m'  'n  '  '  o'
6
ответ дан 23 November 2019 в 07:16

Используя только ls опции, можно сделать это:

ls -sd --block-size=1 --format=single-column *

Вот опции:

  • -sd говорит для печати выделенного размера файла в блоках и d опция удаляет "общую" строку каталога из вывода

  • --block-size=1 печать 1 байт за единицу размера (вместо K)

  • --format=single-column говорит для печати результатов как отдельного столбца

  • * говорит для выполнения ls на всех файлах в текущем каталоге и необходим при использовании d опция

Это предполагает, что Ваш текущий каталог Historic_Documents.


Править:

Поскольку Вы хотите размер содержания файла, я не думаю, что можно сделать это с только ls опции. Однако можно использовать du для получения точного результата, Вы требуете:

du -b *

-b или --bytes опция печатает фактический размер файла в байтах, который также эквивалентен опциям: --apparent-size --block-size=1.

Очевидный размер является размером файла (подобное размерам, перечисленным ls -l) а не выделенный размер файла или использование диска.

5
ответ дан 23 November 2019 в 07:16

С просто ls, нет, но с stat (если Вы имеете ls Вы имеете stat):

stat -c "%s %n" *
  • stat с форматом (-c, --format) самый гибкий путь состоит в том, чтобы получить данные файла
  • Хотя не явно указанный в странице справочника, можно использовать спецификаторы ширины и точности на полях, например, чтобы перечислить размер на 8 столбцах:

    stat -c "%8s %n" *
    
3
ответ дан 23 November 2019 в 07:16

Обновление 2

Вот острота, которая использует awk, который обладает преимуществом также сохранения нескольких последовательных пробелов в именах файлов:

ls -l | awk 'BEGIN{FPAT="([[:space:]]*[^[:space:]]+)"; OFS = "";} FNR == 1 {next} {$1=$2=$3=$4=$6=$7=$8=""}1'
  • FPAT="([[:space:]]*[^[:space:]]+)" используется для установки регулярного выражения того, каково поле должно быть. Здесь мы устанавливаем поле, чтобы иметь нуль или больше пробельных символов и по крайней мере один из любого символа кроме пробела. Предложение об использовании FPAT был найден в этом ответе Переполнения стека.

  • OFS = "" используется так, чтобы вывод только имел одиночный пробел как разделителя полей (другой добавляется текстовым управлением).

  • FNR == 1 {next} используется так, чтобы пустая строка вначале, которая соответствует первой строке ls -l вывод, который показывает общее количество используемых блоков, не будет распечатан.

  • {$1=$2=$3=$4=$6=$7=$8=""}1 освобождает указанные поля и печатает остальных, т.е. пятое поле (размер файла) и девятое до конца (имя файла).

Нужно отметить, что каждая строка вывода вышеупомянутой команды будет иметь одни или несколько ведущих пробелов. По-моему, это делает вывод легче читать, однако, можно удалить ведущие пробелы путем передачи по каналу awk команда к sed следующим образом (удаляют * от sed команда для удаления всего одного ведущего пространства):

ls -l | awk 'BEGIN{FPAT="([[:space:]]*[^[:space:]]+)"; OFS = "";} FNR == 1 {next} {$1=$2=$3=$4=$6=$7=$8=""}1' | sed 's/^ *//'

Обновление

Лучший подход должен был бы использовать cut на ls -l вывод:

ls -l | tr -s ' ' | cut -d ' ' -f 5,9-

Здесь, tr -s ' ' используется для сжатия нескольких пробелов между полями ls -l вывод одному и затем cut использует пространство как разделитель для отображения пятого поля (размер файла) и все поля после девятого (имя файла) ls -l вывод.

Обратите внимание, однако, что, если у Вас есть имена файлов с несколькими последовательными пробелами, они будут отображены как имеющий одиночные пробелы, из-за tr (спасибо bac0n).


Можно использовать это:

ls -sh
  • -s (или --size): печатает выделенный размер каждого файла, в блоках.
  • -h (или --human-readable) печатает размер в человекочитаемом формате (т.е. использующий K, M, и т.д. для тысяч, миллионов, и т.д. соответственно).

Можно читать ls страница справочника для большего количества информации путем выполнения man ls в Вашем терминале или путем посещения Ubuntu ls страница справочника онлайн.

3
ответ дан 23 November 2019 в 07:16

Невозможно сделать с ls команда отдельно. Можно сделать это путем передачи по каналу ls -l вывод к другим командам или с полностью другой командой как find поскольку другие ответили.

tree команда дает другую альтернативу:

rick@alien:~/askubuntu$ tree -h
.
├── [8.8K]  aptfielout
├── [1.8K]  aptfilein
├── [ 435]  aptfileout
   (... SNIP ...)
├── [  38]  script
├── [4.0K]  subdir-A
│  ├── [  14]  1.mp4
│  ├── [  14]  2.mp4
│  ├── [  14]  3.mp4
│  └── [4.0K]  JSON
│  └── [4.0K]  JSON
│  ├── [   7]  1.json
│  ├── [   7]  2.json
│  ├── [   7]  3.json
│  └── [   7]  4.json
   (... SNIP ...)
├── [1.5K]  ttlus
└── [1.3K]  ttlus~

7 directories, 57 files

tree опция передала, -h для человекочитаемого размера. Для размера в точной передаче байтов -s.

2
ответ дан 23 November 2019 в 07:16
ls --size --format=single-column
1
ответ дан 23 November 2019 в 07:16

Команда:

ls -l | awk '{print $5, $9}'
1
ответ дан 3 November 2020 в 08:18

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

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