У меня есть большое количество файлов журналов, идея состоит в том, чтобы сгруппировать их по дате / месяцу и затем упаковать в архивы.
Вот мой сценарий:

find /c/this/path/ -type f -name "$file_pattern" | xargs -I fn basename fn | cut -c$start-$end | uniq | xargs -I {} sh -c "tar zcvf {}-$postfix.tgz {}$file_pattern"

все переменные определены. Однако, когда я выполняю это (вызываю функцию, которая содержит этот скрипт), архив не создается, и ошибки не отображаются. Когда я запускаю это вручную, с жестко закодированными параметрами, он работает нормально. Я думаю, я облажался с заменой параметров.
Кстати, я запускаю это в Windows, используя команды, которые поставляются с установкой msysgit (если это имеет какое-то значение).

3 ответа3

0

Если я понимаю ваш вопрос, вы хотите знать, как передавать аргументы в скрипт, указанный в -c

...|xargs -I {} sh -c 'tar zcvf "$1"-'"$postfix"'.tgz "$1"'"$file_pattern" _ {}

Первый аргумент после скрипта (_) станет $0 в sh , а следующий аргумент ({} из xargs) будет $1 . Сочетание одинарных и двойных кавычек немного запутанно, но необходимо, так как у вас есть некоторые параметры, которые вам нужно заменить сейчас, а некоторые - для обработки sh .

0

Вы должны называть свои переменные, например, ${variable} вместо $variable также принято записывать их в Caps, например, так: ${VARIABLE}

0

Мне кажется, что я понимаю проблему. Сам сценарий в порядке. file_pattern определяется как: file_pattern=*.log Однако в текущем каталоге у меня был файл, соответствующий этому шаблону (например, что-то.log) - и переменная file_pattern была заполнена именем этого файла. После того, как я обернул оценку file_pattern в двойные кавычки, все было хорошо. Может быть, кто-то скажет мне, почему такое расширение?
РЕДАКТИРОВАТЬ Я избежал звездочки, как это: file_pattern=\*.log и скрипт теперь работает нормально

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .