сохранить в текстовом файле список файлов с размером каждого файла

#!/bin/sh

ps aux >ps-out.old
sleep 180
ps aux >ps-out.new

diff -u ps-out.old ps-out.new | grep '^[+-]'

Это выполняет ps auxи сохраняет результат в файл. Затем он ждет три минуты, прежде чем повторить то же самое. Затем он использует diff, чтобы получить различия между двумя наборами выходных данных из ps, и grep, чтобы получить только строки в выходных данных diff, которые были добавлены или удалены.

0
04.01.2020, 21:53
4 ответа

С оболочкой bashв Linux (или в системе с совместимой statреализацией):

shopt -s globstar dotglob nullglob

for pathname in./**/*; do
    if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
        stat -c $'%s\t%n' "$pathname"
    fi
done >outfile.csv

Для bashв OpenBSD (или в некоторых других системах BSD с аналогичной реализациейstat)используйте

shopt -s globstar dotglob nullglob

for pathname in./**/*; do
    if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
        stat -f '%z%t%N' "$pathname"
    fi
done >outfile.csv

Оба они будут перебирать все имена в текущем каталоге или ниже него. Для каждого обычного файла вызывается stat, и видимый размер файла в байтах и ​​путь к файлам печатаются с символом табуляции -в -между ними.


Использование только оболочки zsh:

zmodload -F zsh/stat b:zstat
zstat -n +size./**/*(D.)

Это делает встроенную команду -в zstatдоступной в оболочке, а затем использует ее для получения пути и видимого размера файла в байтах для каждого обычного файла в текущем каталоге или ниже (, включая файлы со скрытыми имена ).

Вывод может выглядеть примерно так для неглубокого каталога с несколькими небольшими файлами:

./file1 136
./file2 136
./somedir/file3 136

... так что не очень CSV -вроде.

Это также можно было бы сделать в простом цикле, что позволило бы нам более точно отформатировать его:

zstat -L -A data -n +size./**/*(D.)
for name size in $data; do
    printf '%s\t%s\n' $size $name
done >outfile.csv

Это вызовет zstatдля всех обычных файлов в текущем каталоге или ниже, сохранит результат в массиве data, а затем зациклится на элементах этого массива (будет чередование имен путей и размеров файлов. ).Для каждой пары путь/размер сначала напечатайте размер в байтах, затем табуляцию и путь. Здесь вывод помещается в outfile.csvв текущем каталоге.

Укороченная версия, которая избавляется от цикла, но платит за него несколько более неясным кодом (, если вы не знакомы со строками формата printf):

zstat -L -A data -n +size./**/*(D.)
printf '%2$s\t%1$s\n' $data >outfile.csv

Формат printf%2$s\t%1$s\nуказывает, что два аргумента должны выводиться в виде строк, но в обратном порядке (массив dataхранит пары путей и размеров файлов в указанном порядке )с вкладкой в -между ними. Формат будет повторно использоваться для каждой пары путей и размера файла, пока массив dataне будет исчерпан.


Ни один из приведенных выше вариантов не заботится о том, чтобы CSV -заключал пути в кавычки, которые содержат табуляцию или новую строку.

2
28.01.2020, 02:15

Вы можете использовать опцию -lsдля поиска:

find /dir -ls >filename.csv

Однако при этом будет напечатано больше информации, чем просто имя файла и размер.

В качестве альтернативы вы можете использовать findв сочетании сstat:

find /dir -exec printf '%s,' {} \; -exec stat -f %z {} \; >filename.csv

Это напечатает имя файла и размер в байтах, разделенных запятой (, так как вы выводите в CSV-файл, вы также можете заменить это на ваш предпочтительный разделитель.)

1
28.01.2020, 02:15

Это можно сделать с помощьюls:

  1. ls -l > output-Это сохранит список каталога (, включая размер )внутри файла output, например:
total 4
-rw-r--r-- 1 ashleyprimo ashleyprimo 124 Jan  4 20:01 test1
-rw-r--r-- 1 ashleyprimo ashleyprimo   0 Jan  4 19:56 test2
-rw-r--r-- 1 ashleyprimo ashleyprimo   0 Jan  4 19:56 test3
-rw-r--r-- 1 ashleyprimo ashleyprimo   0 Jan  4 19:56 test5

Вы можете добавить -a, чтобы включить скрытые файлы (, например. те с а. перед ними ); и вы можете добавить -h, чтобы сделать вывод размера «удобочитаемым» -(, например. отображается в МБ, ГБ и т. д. вместо байтов, как показано выше)

Если вам нужен простой вывод размера файлов текущих каталогов, вы можете использовать :ls -lh | grep -vE "total|\." | awk {'print $5 " " $9'} > output, который будет выводить вот так:

124 test1
0 test2
0 test3
0 test5
0
28.01.2020, 02:15

Если вы хотите, чтобы ваш CSV-файл был разделен запятыми, и что ни одно из имен файлов не содержит двойных кавычек, запятых или символов новой строки, с реализацией GNU find, попробуйте:

find -printf "%p,%s\n" >filename.csv
2
28.01.2020, 02:15

Теги

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