Я хотел бы получить список всех файлов на жестком диске, включая размер, дату последнего изменения и абсолютный путь.
Формат идеи:
[file size] [last modified date] [absolute path] [ filename]
Я пытался:
ls -lhR | awk -v PWD=$PWD '{printf("%4s %4s %2s %5s %s/%s\n", $5, $6, $7, $8, PWD, $9); }' >> /tmp/report.list
Все работало отлично, пока не наткнулся на некоторые файлы/каталоги с пробелами между ними... Поэтому я попробовал:
find . -name "*" -exec du -sh {} \; -exec date -r {} \; -exec echo " " \; >> /tmp/report.list
Но вывод, похоже, разбит на 3 строки вместо 2, а напечатанный путь не является абсолютным путем к файлу.
Что я должен делать?
решение1
Вы можете использовать find
действие -printf
для непосредственного вывода этих атрибутов, например:
find "$PWD" -printf '%s\t%Tx\t%h\t%P\n'
%s
: Размер файла в байтах.%Tx
: Время последнего изменения файла в формате даты, принятом в локали%h
: Ведущие каталоги имени файла%P
: Имя файла с именем аргумента командной строки, под которым он был обнаружен, удалено.
Путь к каталогу ( %h
) выводится относительно аргумента пути командной строки, с которым find
вызывается команда: при указании рабочего каталога с помощью $PWD
, он становится абсолютным.
решение2
Вы можете использовать -printf
опцию в поиске:
find / -type "f" -printf "%s\t%TY-%Tm-%Td\t%p\n" > file.txt
Это создает файл в формате:
[размер в байтах]TAB[Дата последнего изменения в формате ГГГГ-мм-дд]TAB[ПОЛНЫЙ ПУТЬ]
Он будет работать с полной файловой структурой.
Замените каждый \t
пробелом, если вы не хотите, чтобы он был разделен табуляцией. Используя man find
вы можете найти другие варианты форматирования для -printf
опции в find
.