LINUX.ORG.RU
решено ФорумAdmin

Вывести для всех файлов в ФС имя, atime, размер и имя пакета, к которому файл относится

 ,


0

1

Какую команду надо дать?

find / -type f -xdev -exec echo `stat --format='%n %s %X' '{}'` `dpkg -S '{}'` \;

Выводит пустые строки.

Это надо, чтобы Показать наименее нужные пакеты (комментарий)

slowpony

UPD1

Ubuntu 18.04

UPD2

find / -type f -xdev -exec stat --format='%n|%s|%X|' '{}' \; -exec dpkg -S '{}' \;

Делает ближе к тому, что надо, но dpkg -S выводит <пакет>: <файл>, а надо вывести <пакет>, а если файл не относиться ни к одному пакету, то ничего. И find выводит результат второго exec'а новой строкой, а надо на той же строке, либо после поставить какой-то другой разделитель, чтобы при машинной обработке было понятно, что к какому файлу относится.

UPD3

Рабочий однострочник:

find / -xdev -type f -exec stat --printf='%n|%s|%X|' '{}' \; -exec sh -c "dpkg -S '{}' 2>/dev/null | cut -d' ' -f1 | rev | cut -c 2- | rev; dpkg -S '{}' 1>/dev/null 2>/dev/null || echo" \;

Перемещено hobbit из general

★★★

Последнее исправление: damix9 (всего исправлений: 3)

#!/bin/bash

find / -type f 2>/dev/null | while read filename
do
	if pkgname=$(dpkg -S "$filename" 2>/dev/null )
	then
		echo -n "Package name $pkgname:"
		stat --format=' %s %X' "$filename"
	fi
done

Допили сам.

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

Чтобы в выводе не было повторения имени файла в результате работы dpkg -S, можно воспользоваться cut:

find / -type f -exec stat --printf='%n|%s|%X| ' '{}' \; -exec sh -c "dpkg -S '{}' | cut -d' ' -f1" \;

или так

find / -type f -exec stat --printf='%n|%s|%X| ' '{}' \; -exec sh -c "dpkg -S '{}' | cut -d':' -f1" \;

только поскольку в последнем случае разбиение идёт по ‘:’, часть информации о пакете может также пропасть (например, вместо «libc6-dev:amd64» будет «libc6-dev»)

vasilisk_lo
()