2016-02-15 4 views
0

Я почти новичок в скрипте оболочки, но не знаю некоторых команд. Я пытаюсь написать ниже сценарий оболочки, пожалуйста, дайте некоторое направление. 1. Прочтите * .gz файлы из определенного каталога 2. Извлеките его в другую папку 3. Переместите исходный файл в другую папку. Я могу сделать это три отдельных сценария оболочки, но я хочу, чтобы он включал один скрипт оболочки. Тогда этот скрипт будет cronjob и будет запускаться каждые 5 минут. Я пытался начать, как показано ниже, но почему-то я немного смущен, как получить файл списка. Я могу здесь сделать еще один сценарий, но хотите включить в один сценарий «О: извлечение * .gz файлов и перемещение исходного файла в другую папку


#!/bin/bash 

while IFS= read file; do 
    gzip -c "$file" > "zipdir/$(basename "$file").gz" 
done < filelist 
----------------------------------------- 

PS:. Файлы создаются в каждые 5 минут

ответ

1

Есть несколько способов, чтобы осуществить то, что вы ищете. . для (я хотел бы рассмотреть notify) Во всяком случае ... это очень простая реализация:

$ source=~/tmp/source # directory where .gz files will be created 
$ target=~/tmp/target # target directory for uncompressed files 
$ archive=~/tmp/archive # archive dir for .gz files 
$ shopt -s nullglob  # avoid retiring unexpanded paths 
$ for gz in ${source}/*.gz ; do gzip -dc "$gz" > ${target}/$(basename "$gz" .gz) ; mv "$gz" ${archive}/ ; done 
$ shopt -u nullglob  # reset nullglob 

Если вы знаете наверняка «источник» каталог всегда будет содержать .gz файлы, которые вы можете избежать шо пт.

Другое решение (не требует shopt) заключается в следующем:

find ${source} -name '*.gz' -print0 | while read -d '' -r gz; do 
    gzip -dc "$gz" > ${target}/$(basename "$gz" .gz) 
    mv "$gz" ${archive}/ 
done 

Первая строка выглядит немного сложнее, поскольку он управляет имена исходных файлов, содержащих пробелы ...

+0

Спасибо очень много, это а не gzip, это должно быть gunzip право на экстракт? и просто не понимаю товарt -s nullglob и магазинt -u nullglob. (не удаляйте неиспользуемые пути) – user347918

+0

Предположим, что ваш «исходный» каталог (тот, который содержит исходные .gz-файлы, пуст). В этом случае цикл for возвращает неэкспонированный источник $ */gz (со звездочкой) и, конечно же, и gzip, и mv будут жаловаться на него. Установив флаг «nullglob» с помощью 'shoot -s nullglob', мы предотвращаем возврат нерасширенного (несуществующего) пути. Другая команда в конце 'shoot -u null glob 'сбрасывает этот флаг по умолчанию. – mauro

+0

re-gunzip: моя команда правильная, потому что я использовал параметр '-d' (распаковать) (" gunzip "=" gzip -d "). – mauro