1

Я использую bash в Windows (распространяется вместе с msysgit) для архивирования файлов журналов - один архив в день. Проблема в том, что следующий скрипт не работает, и я понятия не имею, почему. Вырезать здесь, чтобы получить часть имени файла, которая соответствует дате написания журнала.

find . -type f -name '*.log' | cut -c3-12 | head -n 5 | xargs -I common printf "%s%s\n" common "*.log" | xargs -I fg tar cvzf hello.tgz fg

Перед последним шагом каждая строка выглядит так - 2014-07-04 * .log
На последнем шаге это дает мне вывод, как это:

tar: 2014-07-01*.log: Cannot stat: No such file or directory

Я подозреваю, что это из-за новой строки в конце, потому что когда я вызываю команду tar вручную, она работает нормально. Есть идеи, что я пропустил? Я прочитал некоторые из подобных ответов, но они, кажется, не применимы в моем случае. Название архива, например, позже я сделаю более информативным.

1 ответ1

2

Проблема в этой части:

xargs -I common printf "%s%s\n" common "*.log"

*.log вставляется в шаблон как есть. Я не понимаю, почему вы вообще ставите "*" там. Это исправит это:

xargs -I common printf "%s%s\n" common .log

Однако последняя команда tar самом деле не будет работать, потому что команда tar cvzf hello.tgz fg будет выполняться для каждого файла, и поэтому вы получите tar с единственным файлом в нем (последним).

Я считаю, что это должно быть ближе к тому, что вы хотите:

find . -type f -name '*.log' | cut -c3-12 | uniq | xargs -I{} sh -c 'tar zcvf {}.tgz {}*.log'

Если у вас есть файлы, такие как:

2014-07-01.1.log
2014-07-01.2.log
2014-07-02.1.log
2014-07-02.5.log
2014-07-02.6.log

Затем команда поместит первые 2 в 2014-07-01.tgz а последние 3 в 2014-07-02.tgz .

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