python 中的 bash rsync 脚本工作异常

python 中的 bash rsync 脚本工作异常

我在 python 中使用 bash 时遇到了这个问题。我想编写一个脚本,根据系统日期创建文件夹 - 并且这个脚本运行正常。问题是当我想 rsync 两个目录时,一个目录包含我要备份的文件,另一个目录以系统日期为名称创建。

    import os
    f = os.system("bash -c 'DATE=folder-`date +%y%m%d;mkdir /home/lol/$DATE;'")
    g = os.system("bash -c 'rsync -av /folderToBackup/ /home/lol/$DATE/;'")

当 rsync 复制文件时,它们都会落在 /home/lol/ 中,而不是 /home/lol/$DATE 中

如果有人知道解决方案,请告诉我,我尝试了不同的目录,但 rsynced 文件总是不放在按日期创建的文件夹中,而是放在更高的文件夹中,例如 /home/lol/

答案1

在第二行中,$DATE由于您启动了新的 shell,因此不再定义,并且它丢失了第一次调用的变量定义。

为什么不把它包装成一个 shell 脚本或者从 Python 中提供日期?你为什么要使用 Python?坦率地说,你的方法很荒谬。

$!/bin/bash
DATE=folder-`date +%y%m%d;mkdir /home/lol/$DATE
rsync -av /folderToBackup/ /home/lol/$DATE/

答案2

在您的示例中,您启动了一个 bash 并设置了 DATE 变量,因此 DATE 变量仅在此 bash 进程中可用。当您启动一个新的 bash(用于您的 rsync)时,您没有设置 DATE 变量。当您读取此变量时,它是空的。这就是您复制到 /home/lol 的原因。因此,对于您的脚本,只需在第二个(rsync)bash 进程中设置 DATE 变量。

我认为对于你的目标来说更好的解决方案是使用python的约会时间制作目录.然后为 rsync 启动一个 os.system bash 进程。

答案3

问题在于您处理变量 $DATE 的方式。此变量在第一次执行时可见(当您创建具有所需日期的目录时)。当脚本尝试执行 rsync 时,os.system() 的第二次执行不知道此 $DATE 变量的内容。因此,您需要以某种方式将此值从第一次执行传递到第二次执行。

您可以探索 Python 模块“subprocess”,它也比 os 模块更好地实现这种结果。这是我的测试:

from subprocess import PIPE
from subprocess import Popen


def exec_and_show(command):
    process = Popen(
        args=command,
        stdout=PIPE,
        shell=True
        )
    return process.communicate()[0]


my_folder = exec_and_show("bash -c 'DATE=folder-`date +%y%m%d`;mkdir /home/lol/$DATE;echo $DATE'")

print "My folder is: {0}".format(my_folder)

我绝对不会使用编程语言来执行这样的两行代码。这里还有一些使用 shell 脚本解决问题的答案,效果更好。不仅因为解决方案更简单(只有两行代码),还因为简单性意味着一切(例如,未来的维护)。

相关内容