我在 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
答案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 脚本解决问题的答案,效果更好。不仅因为解决方案更简单(只有两行代码),还因为简单性意味着一切(例如,未来的维护)。