Некоторые версии find
(невстроенный Linux, Cygwin, OSX, FreeBSD), позволяют Вам сравнивать время изменения файла со ссылочной датой с -newermt
оператор.
find /storage/backup/rman -newermt '2012-12-01' ! -newermt '2013-01-01'
Вы не можете использовать -mtime
сказать, был ли файл изменен в конкретную дату, потому что этот оператор относительно времени, которое Вы выполняете find
команда. Если Ваш find
не имеет -newermt
оператор, создайте ссылочные файлы и используйте -newer
оператор.
touch -t 201212010000 start
touch -t 201301010000 end
find /storage/backup/rman -newer start ! -newer end
Для получения общего размера файлов использовать du -c
и сохраните только последнюю (“общую”) строку. Необходимо будет исключить каталоги, потому что при передаче каталога du
, это складывает размеры всех файлов в соответствии с тем каталогом.
find /storage/backup/rman -type f -newermt '2012-12-01' ! -newermt '2013-01-01' -exec du -c {} + | tail -n 1
Если у Вас есть большое количество файлов, длина командной строки могла бы быть слишком большой, таким образом, find
будет работать du
многократно и команда выше только перечислила бы вывод от последнего пакета. В этом случае необходимо будет сложить суммы от каждого выполнения. Вот один способ сделать это.
find /storage/backup/rman -type f -newermt '2012-12-01' ! -newermt '2013-01-01' \
-exec sh -c 'du "$@" | tail -n 1' _ {} + |
awk '{total += $1} END {print total}'
Осуществление: что случилось со следующей командой? (Т.е. в том, какая необычная но возможная ситуация это сообщит о неправильном числе?)
find /storage/backup/rman -type f -newermt '2012-12-01' ! -newermt '2013-01-01' \
-exec du {} + |
awk '$2 == "total" {total += $1} END {print total}'
Вы можете сохранить расширение скобки в массиве, а затем вывести его на выбор:
urls=( localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} )
Затем
printf "%s\n" "${urls[@]}"
или
(IFS=$'\n'; echo "${urls[*]}")
Пример эха выглядит странно, потому что:
IFS=$'\n' эхо "${urls[*]}"
, потому что переменная расширяется до того, как новая переменная env вступит в силуТакже обратите внимание на то, что используется тонкое различие в индексе разыменовывающего массива:
.[@]
в примере printf расширить массив на отдельные слова [*]
в эхо-примере для расширения массива до одного слова, с элементами, разделенными первой диаграммой IFSПроблема в том, что расширение скобки добавляет пространство, а эхо - новую строку. Поэтому, используя принцип единой ответственности, работайте с новой строкой отдельно.
echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} | tr " " "\n"
Используйте printf
builtin:
$ printf %s\\n localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}
localhost:8080/reports/promos/130
localhost:8080/reports/promos/130.pdf
localhost:8080/reports/promos/130.xls
localhost:8080/reports/promos/130.xlsx
localhost:8080/reports/promos/130.csv
localhost:8080/reports/promos/130.preload
localhost:8080/reports/promos/130-unburdened
localhost:8080/reports/promos/130-unburdened.pdf
localhost:8080/reports/promos/130-unburdened.xls
localhost:8080/reports/promos/130-unburdened.xlsx
localhost:8080/reports/promos/130-unburdened.csv
localhost:8080/reports/promos/130-unburdened.preload
....
Это тегированный zsh, поэтому я предлагаю встроенную функцию zsh print
:
print -l localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}
-l
печатает аргументы в отдельных строках.