LINUX.ORG.RU

ls -l Получить только имя файла и размер


0

1

Вечер добрый! Бьюсь над такой задачей: Есть каталог с файлами и папками. Надо получить имя каждого ФАЙЛА и его размер, причём рекурсивно (в смысле, в подкаталогах тоже.)

Сделал такую штуку, но не знаю, как убрать лишние столбцы в ls -l. Также думал над функцией stat, но не знаю, как сделать просмотр и подкаталогов (с отображением имени каждого подкаталога).

#!/bin/sh

cd $1||quit

echo Каталог `pwd|sed 's/.*\///g'`:

ls -lR|sed 1d|grep -v ^d|grep -v ^итого|sed 's/^.\//Каталог /g'|sed 's/^-..........//'

Ответ на: комментарий от Patriarh

Если имя должно быть полным, то задача сводится к созданию на sh ограниченного аналога find (рекурсивный обход каталогов + получение размеров при помощи stat или ls).

Куда это нужно? Встраиваемая система без find? Или идиотское задание в ВУЗе?

geekless ★★
()
Ответ на: комментарий от Patriarh

ну если такое кхе-кхе ограничение, то проще уж на С :)
Хотя конечно проще на ls'е

Jetty ★★★★★
()
Ответ на: комментарий от geekless

Задание в ВУЗе) А find запрещён, чтоб жизнь мёдом не казалась... Ибо с find'ом решение совсем уж в одну строку укладывается)))

Patriarh
() автор топика
Ответ на: комментарий от Patriarh

>И чтобы сортировал по имени?

Так по умолчанию же сортирует, разве нет?

>А как сделать, чтобы он выводил размер как в ls -l?

Это в байтах, что ли?

man du

-b, --bytes Выдавать размеры в байтах вместо килобайтов.

На всякий случай,

man du

-h, --human-readable Добавлять букву размера, например M для двоичного мегабайта (`мебибайт'), к каждому размеру.

schizoid ★★★
()

Поскольку я сегодня добрый, то дам пример универсального решения, без find и без фильтрования ls -lR. Корректно работает с именами файлов, содержащими пробелы и символы за пределами ASCII.

#!/bin/bash

list()
{
	local PREFIX="$1"
	(cd "$PREFIX" && eval stat --printf='%s\\n%n\\n' `ls -AQ` 2>/dev/null) | while read size ; do
		read name
		name="${PREFIX}$name"
		if [[ -d "$name" ]] ; then
			list "$name/"
		elif [[ -f "$name" ]] ; then
			echo "${size}	${name}"
		fi
	done
}

PREFIX="$1"
if [[ -z "$PREFIX" ]] ; then
	PREFIX="."
fi
list "${PREFIX}/"
geekless ★★
()
Ответ на: комментарий от legolegs

> du -a

Не соответствует условию задачи. «Есть каталог с файлами и папками. Надо получить имя каждого ФАЙЛА и его размер»

geekless ★★
()
Ответ на: комментарий от geekless

Всем огромное спасибо и geekless в частности)

Patriarh
() автор топика
Ответ на: комментарий от schizoid

Извините, по неопытности я подразумевал, что каталоги надо исключить. Именно для этого в том, с чего я начал есть ls -lR|grep -v ^d

Patriarh
() автор топика
Ответ на: комментарий от Patriarh

> Ибо с find'ом решение совсем уж в одну строку укладывается

facepalm, на то и рассчитано же

q11q11 ★★★★★
()
Ответ на: комментарий от schizoid

Ну это уже некрасиво - гонять du дважды. Лучше уж монстрик гиклесса.

legolegs ★★★★★
()
Ответ на: комментарий от geekless

Буэээ даже рукурсия

А между тем: [code] ls -Rl |while read line; do if [[ $line == -* ]]; then echo $line; fi; done [/code]

думаю топиксратер додумается выковырять нужные поля?

_________

//wfrr

anonymous
()
Ответ на: комментарий от geekless

Буэээ даже рукурсия

А между тем:

ls -Rl |while read line; do if [[ $line == -* ]]; then echo $line; fi; done

думаю топикстартер додумается выковырять нужные поля?

_________

//wfrr

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.