#!/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
, которые были добавлены или удалены.
С оболочкой 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 -заключал пути в кавычки, которые содержат табуляцию или новую строку.
Вы можете использовать опцию -ls
для поиска:
find /dir -ls >filename.csv
Однако при этом будет напечатано больше информации, чем просто имя файла и размер.
В качестве альтернативы вы можете использовать find
в сочетании сstat
:
find /dir -exec printf '%s,' {} \; -exec stat -f %z {} \; >filename.csv
Это напечатает имя файла и размер в байтах, разделенных запятой (, так как вы выводите в CSV-файл, вы также можете заменить это на ваш предпочтительный разделитель.)
Это можно сделать с помощьюls
:
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
Если вы хотите, чтобы ваш CSV-файл был разделен запятыми, и что ни одно из имен файлов не содержит двойных кавычек, запятых или символов новой строки, с реализацией GNU find
, попробуйте:
find -printf "%p,%s\n" >filename.csv