Предположим, что мой каталог '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
Как проанализировать вывод от 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'
Используя только 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
) а не выделенный размер файла или использование диска.
С просто ls
, нет, но с stat
(если Вы имеете ls
Вы имеете stat
):
stat -c "%s %n" *
stat
с форматом (-c
, --format
) самый гибкий путь состоит в том, чтобы получить данные файлаХотя не явно указанный в странице справочника, можно использовать спецификаторы ширины и точности на полях, например, чтобы перечислить размер на 8 столбцах:
stat -c "%8s %n" *
Обновление 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
страница справочника онлайн.
Невозможно сделать с 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
.