1

如何让 tar/cp 仅复制不以 .jar 结尾且仅在根目录和 /plugins 目录中的文件?

所以,我正在制作一个 Minecraft 服务器备份脚本。我希望拥有的选项之一是仅备份配置文件。这是场景:

  1. 里面有很多文件夹,里面有大量的数据。
  2. 配置文件主要使用以下扩展名,但有些可能使用不同的扩展名:
    • .yml
    • .json
    • 。特性
    • .loc
    • .dat
    • .ini
    • 。文本文件
  3. 配置文件主要出现在/plugins文件夹中
  4. 根目录中有一些配置文件,但除 /plugins 之外的任何其他文件都没有
  5. 这两个目录中唯一的其他文件是 .jar 文件 - 在一定程度上。这些不需要备份。这就是当前工作插件标志的工作。

该代码混合使用tarcp取决于用户使用哪些标志启动该过程。该过程从命令开始,然后通过连接变量添加路径,例如$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

---更多专业的东西----

# 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

我可以在必要时提供更多代码/解释。

4

2 回答 2

2
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/ \;

可能有帮助。

于 2012-01-14T13:18:24.937 回答
0

最终代码:

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
于 2012-01-14T23:56:56.693 回答