Bash копирование определенных файлов - PullRequest
1 голос
/ 14 января 2012

Как получить tar / cp для копирования только тех файлов, которые не заканчиваются на .jar и только в каталогах root и / plugins?

Итак, я делаю скрипт резервного копирования для сервера Minecraft.Один из вариантов, который я хотел бы иметь, - это резервное копирование только файлов конфигурации.Вот сценарий:

  1. Существует много папок с огромными объемами данных.
  2. Файлы конфигурации в основном используют следующие расширения, но некоторые могут использовать другое:
    • .yml
    • .json
    • .properties
    • .loc
    • .dat
    • .ini
    • .txt
  3. Файлы конфигурации в основном находятся в папке / plugins
  4. В корневом каталоге есть несколько файлов конфигурации, но ни в каких других, кроме / plugins * 1028, нет.*
  5. Единственными другими файлами в этих двух каталогах являются файлы .jar - в некоторой степени.Их не нужно резервировать.Так работает флаг подключаемых плагинов.

Код использует комбинацию tar и cp в зависимости от того, с какими флагами пользователь начал процесс.Процесс запускается командой, затем пути добавляются через объединенную переменную, такую ​​как $paths = plugins world_nether mysql/hawk, где аргументы могут добавляться по одному за раз.

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

Вот два фрагмента кода, о которых идет речь: Настройка путей:

# My first, unsuccessful attempt.
if $BKP_CFG; then
    # Tell user they are backing up config
    echo " +CONFIG $confType - NOT CURRENTLY WORKING"
    # Main directory, and everything in plugin directory only
    # Jars are not allowed to be backed up
    #paths="$paths --no-recursion * --recursion plugins$suffix --exclude *.jar"
fi

--- Подробнее Pro Stuff ----

# Set commands
if $ARCHIVE; then
    command="tar -cpv"
    if $COMPRESSION; then
        command=$command"z"
    fi
    # Paths starts with a space </protip>
    command=$command"C $SERVER_PATH -f $BACKUP_PATH/$bkpName$paths"
    prep=""
else
    prep="mkdir $BACKUP_PATH/$bkpName"
    # Make each path an absolute path. Currently, they are all relative
    for path in $paths; do
        path=$SERVER_PATH/$path
    done
    command="cp -av$paths $BACKUP_PATH/$bkpName"
fi

Я могу предоставить больше кода / объяснений, где это необходимо.

Ответы [ 2 ]

2 голосов
/ 14 января 2012
find /actual/path ! -iname '*jar' -maxdepth 1 -exec cp \{\} /where/to/copy/ \;
find /actual/path/plugins ! -iname '*jar' -maxdepth 1 -exec cp \{\} /where/to/copy/ \;

Могу помочь.

0 голосов
/ 15 января 2012

Финальный код:

if $BKP_CFG; then
    # Tell user what's being backed up
    echo " +CONFIG $confType"
    # Main directory, and everything in plugin directory only
    # Jars are not allowed to be backed up
    # Find matches within the directory cd'd to earlier, strip leading ./
    paths="$paths $(find . -maxdepth 1 -type f ! -iname '*.jar' | sed -e 's/\.\///')"
    paths="$paths $(find ./plugins -type f ! -iname '*.jar' | sed -e 's/\.\///')"
fi
...