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

Некоторые версии 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}'
8
25.07.2014, 09:42
4 ответа

Вы можете сохранить расширение скобки в массиве, а затем вывести его на выбор:

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[*]}")

Пример эха выглядит странно, потому что:

  1. он запущен в подоболочке (скобках), поэтому я не изменяю свое текущее значение IFS.
  2. IFS нужно определить в отдельной команде:
    • Это не работает: IFS=$'\n' эхо "${urls[*]}", потому что переменная расширяется до того, как новая переменная env вступит в силу
    • IFS нужно установить до того, как вы начнете расширять переменные.

Также обратите внимание на то, что используется тонкое различие в индексе разыменовывающего массива:

.
  • [@] в примере printf расширить массив на отдельные слова
  • .
  • [*] в эхо-примере для расширения массива до одного слова, с элементами, разделенными первой диаграммой IFS
8
27.01.2020, 20:08

Проблема в том, что расширение скобки добавляет пространство, а эхо - новую строку. Поэтому, используя принцип единой ответственности, работайте с новой строкой отдельно.

echo -e localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload} | tr " " "\n"
3
27.01.2020, 20:08

Используйте 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
....
16
27.01.2020, 20:08

Это тегированный zsh, поэтому я предлагаю встроенную функцию zsh print :

print -l localhost:8080/reports/{promos,promo-updates,scandown}/{130,139,142}{,-unburdened,-burdened}{,.pdf,.xls,.xlsx,.csv,.preload}

-l печатает аргументы в отдельных строках.

6
27.01.2020, 20:08

Теги

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