去掉 subprocess.Popen 中的撇号以移动文件

Getting rid of the apostrophe in subprocess.Popen to move files

我的脚本根据它提取的信息生成多个包含 运行dom 名称的文件。我创建此测试是为了尝试将 运行 时创建的所有新文件移动到以 运行.

文件命名的新目录中

当我使用 os.popen("mv " + moveFiles +' ' + filename + "_dir") 时它工作得很好,但是 os.popen 由于 shellshock

被认为是不安全的

当切换到 cmd = Popen(["mv", str(moveFiles), filename + "_dir"]) 时,出现以下错误

mv: cannot stat '/home/test/testing/TestFile1.txt /home/test/testing/TestFile2.txt': No such file or directory

我相信这是因为它在 moveFiles 变量的开头和结尾添加了撇号,它试图将其作为 1 个文件而不是 2 个文件移动。所以它在创建单个文件时有效,但会导致错误。有没有办法删除它?

'/home/test/testing/TestFile1.txt /home/test/testing/TestFile2.txt'
def createDir(filename):
    """
    createDir creates the folder of the file/argument given (Example.txt_dir)
    """
    Dir = str(filename) + "_dir"
    cmd = Popen(["mkdir", Dir], stdout=PIPE, stderr=PIPE) 

def createFiles(filename):
    """
    createFiles creates test files to move into Example.txt_dir
    """
    with open('TestFile1.txt', 'w') as m:
        cmd = Popen(["file", filename], stdout=m, stderr=PIPE)
    print('Saved as TestFile1.txt')

    with open('TestFile2.txt', 'w') as m:
        cmd = Popen(["file", filename], stdout=m, stderr=PIPE)
    print('Saved as TestFile2.txt')

def dirDifference(dir1, dir2):
    """
    dirDifference compares 2 paths, 1 before being ran and 1 after to get a list of all new files to be moved
    """
    #Compares Directory before and after running
    dif = [i for i in dir1 + dir2 if i not in dir1 or i not in dir2]
    separator =  ' '
    x = separator.join(map(str, dif)) 
    return x

def moveDir(filename, moveFiles):
    """
    moveDir: Moves the new files to the directory.
    """
    Dir = str(filename) + "_dir"
    cmd = Popen(["mv", moveFiles, filename + "_dir"])

您的怀疑是正确的:问题在于您将两个文件名与 space 连接在一起。由于您使用的是 Popen() 而不是 os.popen(),因此您绕过了参数的 shell 解释,这意味着单个文件名不会被分开。这与您在命令行中使用引号相同:

mv 'file1 file2' destination
mv: cannot stat 'file1 file2': No such file or directory

您要求它移动名称中间有一个 space 的单个文件。您需要做的是使每个文件名成为 Popen():

列表中的一个单独元素
cmd = Popen(["mv", file1, file2, destination])

对于上面的代码,不是 dirDifference() returning 文件名与 spaces 连接在一起,它可以简单地 return 一个列表,你可以与 Popen():

一起使用
cmd = Popen(["mv"] + moveFiles + [filename + "_dir"])

(确保 moveFiles 当然是一个非空列表)