2016-07-28 2 views
-4

Как я могу загрузить этот файл? Я получаю сообщение об ошибке:Как gzip файл

find /users/tnea01/logfile10.log -type f -exec sh -c \ 'gunzip /users/tnea01/logfile_archive/$(basename $0)_$(date -r {} +%F).gz $0' {} \; 

Здесь ошибка я получаю:

gzip: /users/tnea01/logfile10.tar.gz: No such file or directory gzip: /users/tnea01/logfile10.log: unknown suffix -- ignored

+2

Какая ошибка возникает у вас? – DaBler

+0

Вы находите командную работу без команды exec? –

+0

Здесь нет ошибки я получаю: GZIP: /users/tnea01/logfile10.tar.gz: Нет такого файла или каталога GZIP: /users/tnea01/logfile10.log: неизвестный суффикс - игнорируется – connollyc4

ответ

1

Если вы не знать точное имя файла, вы можете сделать что-то вроде этого:

find /users/tnea01 -maxdepth 1 -name '*.log' -type f -exec sh -c \ 
    'for f; do 
     gzip -c <"$f" >"https://stackoverflow.com/users/tnea01/logfile_archive/${f##*/}_$(date -r "$f" +%F).gz" 
    done' _ {} + 

Объяснение движущихся частей:

  • Единственный безопасный способ использования sh -c - с полностью постоянной строкой; подстановка в него переменных (включая имена файлов) создает уязвимости безопасности. Таким образом, мы не используем какое-либо средство замены в коде, но передаем имя файла (ов) в качестве дополнительных аргументов.
  • for f; do - это то же самое, что и for f in "[email protected]"; do - он выполняет итерацию по всем аргументам командной строки.
  • ${f**#/} оценивает все после последнего / в $f; см. the bash-hackers page on parameter expansion.
  • Различия, включая $(date ...), должны быть в контексте с двойными кавычками, чтобы быть в безопасности; здесь мы помещаем полное имя файла назначения в такие кавычки.

Однако, так как вы делаете, это все совершенно излишни.

f=/users/tnea01/logfile10.log 
d=/users/tnea01/logfile_archive 
gzip -c <"$f" >"$d/${f##*/}_$(date -r "$f" +%F).gz" 
+0

Спасибо, Чарльз Даффи! На самом деле есть 2 файла, которые нужно скопировать, поэтому я использовал ваш первый вывод о том, что работал отлично. У меня есть еще один вопрос, который не имеет большого значения, если он требует слишком много работы. Мой текущий файл журнала называется logfile.log.10, который затем откатывается и удаляется. можно ли изменить его, так что он говорит только logfile.log + last modified date.gz? В основном используется текущее имя файла журнала минус .10 в конце. Еще раз спасибо! – connollyc4

+0

@ connollyc4, по «последней измененной дате», вы имеете в виду, глядя на то, какие файлы журналов существуют в каталоге, находя последний, который действительно существует, и расширяющийся до этого? Вы хотите следовать BashFAQ # 3 для идентификации этого файла; см. http://mywiki.wooledge.org/BashFAQ/003 –

+0

Извините, я думаю, что я не объяснил это правильно. Файл журнала называется «logfile.log.10», в котором я хочу использовать тот же скрипт, что и ваше первое предложение, с помощью команды find, но переименуйте его в logfile.log + дату и время, как это уже делается с датой -r »$ f "+% ​​F).gz " – connollyc4

Смежные вопросы